そうですね、考えられる方法は2つあります。login_required
まず、機能を壊さず、新しい機能を追加するだけであるという意味で、「正しい」方法です。独自のデコレータを作成します。ただし問題は、Django が実際にはログイン後のリダイレクト機能を隠しており、多くの部品が必要なことです。login_required
デコレータは実際にはuser_passes_test
デコレータの単なるラッパーであり、次にredirect_to_login
ビューを呼び出します。クエリ文字列にパラメータを追加するのはそのビューです。next
カスタム デコレーターでは、この機能のすべてまたは一部を直接デコレーターに組み込むことができますが、必要なコードについては 3 つすべてを参照する必要があります。
もう 1 つのはるかに単純なオプションは、設定されている場合にクエリ文字列を削除するミドルウェアを作成することです。
from django.conf import settings
from django.http import HttpResponseRedirect
class RemoveNextMiddleware(object):
def process_request(self, request):
if request.path == settings.LOGIN_URL and request.GET.has_key('next'):
return HttpResponseRedirect(settings.LOGIN_URL)
そして、そのミドルウェアへのインポート パスを に追加しMIDDLEWARE_CLASSES
ます。リクエスト フェーズでは、ミドルウェアは最初から最後まで、つまりトップダウンで処理されることに注意してください。これは、リクエスト フェーズの比較的早い段階で行われますが、それより前に何ができて何ができないかを確認するために、少し試してみる必要があるかもしれません。
この方法の唯一の実際の問題は、次のリダイレクト機能を「壊す」ことであり、非常に直感的な方法ではありません。後の開発者がリダイレクトを許可する命令と共にコードベースを継承した場合、少し混乱する可能性があります。