这是我的登录视图:
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))
login = never_cache(登录)
例如,当我去example.com/myblog/时,我已经重定向到example.com/accounts/login/?next=/myblog /
但是当我插入用户和psw登录时,我已经重定向到/ blogs /而不是/ myblog /
为什么?
编辑:request.REQUEST.get('next','')总是返回''
我不知道为什么: - \
答案 0 :(得分:8)
您的登录表单模板是什么样的?
您的问题
您没有将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
变量,使其看起来像{ {1}}当您提交表单时,您将登录并重定向到/your_login_url/?next=/myblog/
(/myblog/
执行后的内容)。
在您看来,if request.method == 'POST':
仅在您redirect_to = request.REQUEST.get("next")
登录页面时正常工作,但当您GET
时,在GET中未设置POST
变量。
另请注意
登录视图不应该呈现您的博客,博客视图应该这样做。
这就是Django返回的响应的样子,注意它所说的行next
,redirect_field_name: redirect_to,
默认值为redirect_field_name
。
next
并且,您似乎仅为默认重定向覆盖登录视图?这不对恕我直言。 通过设置LOGIN_REDIRECT_URL,您可以在settings.py中设置登录重定向默认位置的正确位置。
但是,既然您正在编写自己的登录视图,为什么不将django中的那个用作骨架,然后根据需要展开它。
答案 1 :(得分:1)
由于
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'的内容