19

私は django の @login_required デコレーターが大好きですが、それを行う方法がわかりません。

認証されていないユーザーが @login_required ページ (例: "/private-stuff/") にアクセスしようとすると、それらをホーム ページ (例: "/home/") に戻します。しかし、URL に "?next=" 引数を追加したくありません。つまり、「/home/?next=/private-stuff/」ではなく「/home/」にリダイレクトしたいだけです。

どうやってやるの?自分のデコレータを書くよりも良い方法はありますか?

4

3 に答える 3

43

それは単に次のようではありませんか:

@decorators.login_required(redirect_field_name=None)
于 2012-10-06T22:35:20.523 に答える
9

そうですね、考えられる方法は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ます。リクエスト フェーズでは、ミドルウェアは最初から最後まで、つまりトップダウンで処理されることに注意してください。これは、リクエスト フェーズの比較的早い段階で行われますが、それより前に何ができて何ができないかを確認するために、少し試してみる必要があるかもしれません。

この方法の唯一の実際の問題は、次のリダイレクト機能を「壊す」ことであり、非常に直感的な方法ではありません。後の開発者がリダイレクトを許可する命令と共にコードベースを継承した場合、少し混乱する可能性があります。

于 2012-06-08T14:50:25.180 に答える
0
login(request, user)
if request.POST['next']:
    return redirect(request.POST['next'])
else:
    msg = u"Welcome..."
    return render_to_response('members/welcome.html', {'msg':msg},
                                              context_instance=RequestContext(request))
于 2014-06-01T16:29:57.657 に答える