【保存版】DjangoのHttpResponseGoneの使い方:サンプルコードで理解を深める
HttpResponseGone
は、Django の django.http
モジュールで提供される HTTP レスポンスクラスの一つです。このクラスは、リクエストされたリソースがもはや存在せず、利用不可であることをクライアントに伝えるために使用されます。これは、リソースが削除された場合や、永続的なリダイレクトが設定されている場合などに役立ちます。
具体的な動作
HttpResponseGone
レスポンスは、HTTP ステータスコード 410 Gone
を返します。これは、クライアントがキャッシュされたコピーを使用しようとしている可能性があるため、キャッシュを無効化するために重要です。
さらに、HttpResponseGone
レスポンスには、リソースがなくなった理由を説明する任意のメッセージを含めることができます。これは、content
パラメータを使用して設定できます。
from django.http import HttpResponseGone
def my_view(request):
# リソースが存在しないことを確認
if not resource_exists:
return HttpResponseGone(content="このリソースは削除されました。")
# 処理を続行...
HttpResponseGone
は、Django 1.0 以降で使用できます。HttpResponseGone
は、単にリソースが存在しないことを伝えるためだけに使用されます。リソースへの代替リソースを提供する場合は、HttpResponseRedirect
を使用する必要があります。
from django.http import HttpResponseGone
from .models import Article
def article_detail(request, pk):
try:
article = Article.objects.get(pk=pk)
except Article.DoesNotExist:
return HttpResponseGone(content="この記事は削除されました。")
# 記事の詳細を表示
# ...
例2:永続的なリダイレクトを設定する
この例では、HttpResponseGone
を使用して、古い URL から新しい URL への永続的なリダイレクトを設定する方法を示します。
from django.http import HttpResponseGone
def old_view(request):
return HttpResponseGone(status=301, new_uri="/new/url/")
例3:カスタムメッセージを含める
この例では、HttpResponseGone
にカスタムメッセージを含める方法を示します。
from django.http import HttpResponseGone
def my_view(request):
# リソースが存在しないことを確認
if not resource_exists:
return HttpResponseGone(content="このリソースは利用不可になりました。詳細については、[ヘルプページ](/help/) をご覧ください。")
# 処理を続行...
- Django の
HttpResponseGone
を使用する方法については、Django ドキュメントを参照してください。
代替方法の例
- http.Http500InternalServerError
サーバーでエラーが発生した場合に使用します。この場合、クライアントはエラーメッセージを表示する可能性があります。 - http.Http404NotFound
リソースが見つからない場合に使用します。この場合、クライアントはエラーページを表示する可能性があります。 - http.HttpResponseRedirect
リソースが別の場所に移動された場合に使用します。この場合、新しい URL をLocation
ヘッダーに設定する必要があります。
具体的な状況と代替方法
状況
- サーバーでエラーが発生した
- リソースが見つからない
- リソースが別の場所に移動された
代替方法
http.Http500InternalServerError
http.Http404NotFound
http.HttpResponseRedirect
- リソースがなくなった理由を説明する任意のメッセージを、レスポンスに含めることができます。
- クライアントがキャッシュされたコピーを使用しようとしている可能性があるため、キャッシュを無効化するために、
Cache-Control
ヘッダーを設定する必要があります。
from django.http import HttpResponseRedirect, Http404NotFound, Http500InternalServerError
def my_view(request):
# リソースが存在しないことを確認
if not resource_exists:
return HttpResponseRedirect(new_uri="/new/url/")
# リソースが見つからない場合
elif not resource_found:
return Http404NotFound()
# サーバーエラーが発生した場合
else:
return Http500InternalServerError()
# 処理を続行...
- Django の HTTP レスポンスクラスの詳細については、Django ドキュメントを参照してください。