ログインとリダイレクト
-
26-09-2019 - |
質問
これは私のログインビューです:
def login(request):
redirect_to = request.REQUEST.get("next")
if request.method == 'POST':
formL = LoginForm(data=request.POST)
if formL.is_valid():
if not redirect_to or '//' in redirect_to or ' ' in redirect_to:
redirect_to = "/blogs/"
from django.contrib.auth import login
login(request, formL.get_user())
if request.session.test_cookie_worked():
request.session.delete_test_cookie()
return HttpResponseRedirect(redirect_to)
else:
formL = LoginForm(request)
request.session.set_test_cookie()
return render_to_response('blogs.html', {
'formL': formL, }, context_instance=RequestContext(request))
ログイン = Never_cache(ログイン)
たとえば、example.com/myblog/ にアクセスすると、example.com/accounts/login/?next=/myblog/ にリダイレクトされます。
しかし、ログインのために user と psw を挿入すると、/myblog/ ではなく /blogs/ にリダイレクトされます。
なぜ ?
編集:request.REQUEST.get('next', '') は常に '' を返します
理由がわからない :-\
解決
ログインフォームのテンプレートはどのようなものですか?
あなたの問題
あなたが送っているのは、 redirect_to
テンプレートへのパスを追加する必要があります。戻り値は次のようになります。
return render_to_response('blogs.html', {
'formL': formL,
'next': redirect_to,
}, context_instance=RequestContext(request)
)
ログイン フォームのアクションは次のようになります。
<form action="/your_login_url/?next={{ next }}" method="post">
それで、あなたが行くときは、 /myblog/
にリダイレクトされます /your_login_url/?next=/myblog/
, 、ログイン ビューはログイン フォームをレンダリングし、 next
ログインフォームのアクション属性の変数は次のようになります /your_login_url/?next=/myblog/
フォームを送信すると、ログインしてリダイレクトされます。 /myblog/
(その後のこと if request.method == 'POST':
実行されます)。
あなたの見解では、 redirect_to = request.REQUEST.get("next")
あなただけの場合は正常に動作します GET
ログインページですが、 POST
それはありません next
GETで設定した変数。
こちらも注意
ログイン ビューではブログをレンダリングする必要はなく、ブログ ビューでレンダリングする必要があります。
Django から返される応答は次のようになります。次の行に注目してください。 redirect_field_name: redirect_to,
, redirect_field_name
の値があります next
デフォルトでは。
return render_to_response(template_name, {
'form': form,
redirect_field_name: redirect_to,
'site': current_site,
'site_name': current_site.name,
}, context_instance=RequestContext(request))
そして、デフォルトのリダイレクトのためにのみログインビューをオーバーライドするようですか?私見ですが、これは正しくありません。ログイン リダイレクトのデフォルトの場所を設定する適切な場所は、settings.py です。 LOGIN_REDIRECT_URL.
しかし、独自のログイン ビューを作成しているのですから、django のログイン ビューをスケルトンとして使用し、必要なものを拡張してみてはいかがでしょうか。
他のヒント
タグので、
not redirect_to or '//' in redirect_to or ' ' in redirect_to
trueと評価された?
<時間>私たちは魚に男を教えるたぶん場合は? http://docs.python.org/library/logging.htmlする
先頭にこれを入れて
import logging
LOG_FILENAME = '/tmp/logging_example.out'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
それはあなたのコード内で適切と思われる場所(例えばif文の後)にこれを入れて
logging.debug("redirect_to = %s" % redirect_to)
ファイル名を指定して実行それは、 '/tmp/logging_example.out'
の内容を見ます