HttpResponseGone

Класс HttpResponseGone наследуется от HttpResponse и предназначен для отправки клиенту HTTP-ответа со статусов 410. Этот статус указывает, что ресурс больше недоступен по указанному URL-адресу и это состояние является постоянным. В отличие от статуса 404, который говорит о временном отсутствии страницы, статус 410 информирует о том, что ресурс был удален намеренно и без возможности восстановления. Класс принимает те же параметры, что и родительский класс, включая содержимое ответа, заголовки и другие атрибуты.

Синтаксис

pythonfrom django.http import HttpResponseGone

response = HttpResponseGone(content=None, content_type=None, status=410, reason=None, charset=None, headers=None)

Пример . С простым сообщением

Создадим простой ответ с сообщением о том, что ресурс удален:

pythonfrom django.http import HttpResponseGone
from django.views import View

class OldArticleView(View):
    def get(self, request, article_id):
        return HttpResponseGone("This article has been permanently removed.")

Пример . Использование в функции-представлении

В функции-представлении можно использовать HttpResponseGone для возврата статуса 410, если ресурс был окончательно удален из базы данных:

pythonfrom django.http import HttpResponseGone, HttpResponseNotFound
from django.shortcuts import get_object_or_404
from myapp.models import Article

def article_detail(request, article_id):
    try:
        article = Article.objects.get(id=article_id)
        if article.is_deleted:
            return HttpResponseGone("The article has been permanently deleted.")
        return render(request, 'article.html', {'article': article})
    except Article.DoesNotExist:
        return HttpResponseNotFound("Article not found.")

Пример . С дополнительными заголовками

Можно добавить пользовательские заголовки в ответ, чтобы передать дополнительную информацию клиенту:

pythonfrom django.http import HttpResponseGone
from django.views.decorators.http import require_GET

@require_GET
def deleted_resource(request, resource_id):
    response = HttpResponseGone("Resource no longer exists.")
    response['X-Resource-ID'] = str(resource_id)
    response['X-Deleted-At'] = "2026-09-07"
    return response

Пример . С JSON-ответом

Для REST API удобно возвращать данные в формате JSON вместе со статусом 410:

pythonimport json
from django.http import HttpResponseGone

def api_deleted_resource(request, resource_id):
    data = {
        'status': 'gone',
        'message': 'Resource permanently deleted',
        'resource_id': resource_id,
        'deleted_at': '2026-09-07T10:30:00Z'
    }
    json_data = json.dumps(data)
    return HttpResponseGone(json_data, content_type='application/json')

Пример . С использованием класса View

В классовых представлениях можно переопределить метод get или использовать специальный метод для проверки доступности ресурса:

pythonfrom django.http import HttpResponseGone
from django.views import View
from myapp.models import Article

class LegacyContentView(View):
    def get(self, request, content_id):
        try:
            content = Article.objects.get(id=content_id)
            if content.status == 'deleted':
                return HttpResponseGone("This content has been permanently removed.")
            return render(request, 'content.html', {'content': content})
        except Article.DoesNotExist:
            return HttpResponseGone("Content no longer exists.")

Пример . С проверкой срока давности

Иногда необходимо автоматически возвращать статус 410 для ресурсов, которые старше определенного периода:

pythonfrom django.http import HttpResponseGone
from django.utils import timezone
from datetime import timedelta
from myapp.models import Article

def old_article_view(request, article_id):
    try:
        article = Article.objects.get(id=article_id)
        three_years_ago = timezone.now() - timedelta(days=3*365)
        if article.created_at < three_years_ago:
            return HttpResponseGone("This article is too old and has been removed.")
        return render(request, 'article.html', {'article': article})
    except Article.DoesNotExist:
        return HttpResponseGone("Article not found.")

Смотрите также