redirects (リダイレクト)アプリ

Django にはオプションで redirects (リダイレクト) アプリケーションが付属しています。リダイレクトをデータベースに保存し、リダイレクトを処理します。デフォルトでは HTTP 応答ステータスコード 301 Moved Permanently を使います。

インストール

redirects アプリをインストールするには、以下の手順に従ってください:

  1. django.contrib.sites フレームワークが インストールされていること を確認してください。
  2. 'django.contrib.redirects'INSTALLED_APPS 設定に追加します。
  3. MIDDLEWARE 設定に 'django.contrib.redirects.middleware.RedirectFallbackMiddleware' を追加します。
  4. コマンド manage.py migrate を実行します。

しくみ

manage.py migrate はデータベースに django_redirect テーブルを作成します。これは、 site_idold_path、および new_path フィールドを持つルックアップテーブルです。

RedirectFallbackMiddleware が全ての作業を担当しています。Djangoアプリケーションが404エラーを発生させるたびに、このミドルウェアは要求されたURLが最終手段としてリダイレクトデータベースをチェックします。具体的には、与えられた old_path とサイトIDが SITE_ID 設定に対応するリダイレクトを確認します。

  • 一致するものが見つかり、かつ new_path が空でない場合、301 ("Moved Permanently") リダイレクトで new_path にリダイレクトします。 RedirectFallbackMiddleware をサブクラス化し、 response_redirect_classdjango.http.HttpResponseRedirect に設定して、 302 Moved Temporarily リダイレクトを代わりに使用できます。
  • 一致するものが見つかり、 new_path が空であれば、410 ("Gone") HTTPヘッダーと空の (content-less) レスポンスを送信します。
  • マッチするものが見つからない場合は、リクエストは通常通り処理されます。

ミドルウェアは、404 エラーにのみアクティブ化され、500 エラーや他のステータスコードのレスポンスには適用されません。

MIDDLEWARE の順番は重要であることに注意してください。一般的に、 RedirectFallbackMiddleware をリストの最後に置くべきです。それは最終手段として機能します。

ミドルウェアについての詳細は ミドルウェアのドキュメント を参照してください。

リダイレクトの追加、変更、削除方法

admin インターフェイス経由

Django の自動管理インターフェイスを有効にしていれば、管理インデックスページに "Redirects" セクションがあるはずです。システムの他のオブジェクトを編集するように、リダイレクトを編集してください。

Python API 経由

class models.Redirect

リダイレクトは標準の Django モデル で表現され、 django/contrib/redirects/models.py にあります。 リダイレクトオブジェクトには、DjangoデータベースAPI を経由してアクセスできます。たとえば:

>>> from django.conf import settings
>>> from django.contrib.redirects.models import Redirect
>>> # Add a new redirect.
>>> redirect = Redirect.objects.create(
...     site_id=1,
...     old_path="/contact-us/",
...     new_path="/contact/",
... )
>>> # Change a redirect.
>>> redirect.new_path = "/contact-details/"
>>> redirect.save()
>>> redirect
<Redirect: /contact-us/ ---> /contact-details/>
>>> # Delete a redirect.
>>> Redirect.objects.filter(site_id=1, old_path="/contact-us/").delete()
(1, {'redirects.Redirect': 1})

ミドルウェア

class middleware.RedirectFallbackMiddleware

ミドルウェアが使用する HttpResponse クラスは、 RedirectFallbackMiddleware のサブクラスを作成し、 response_gone_classresponse_redirect_class をオーバーライドすることで変更できます。

response_gone_class

要求されたパスが見つからないか、new_path に空の値が含まれている時に、 Redirect が見つからないときに使用される HttpResponse クラス。

デフォルトは HttpResponseGone です。

response_redirect_class

リダイレクトを処理する HttpResponse クラス。

デフォルトは HttpResponsePermanentRedirect です。

Back to Top