题
这是我的登录的观点:
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 /
,但是当我插入用户和PSW为登录然后我已经重定向到/博客/和不/ myblog /
为什么?
编辑:request.REQUEST.get( '下', '')总是返回 ''
我不知道为什么: - \
解决方案
如何登录表单模板是什么样子?
您的问题强>
您没有发送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/
,登录视图然后呈现登录表单和替换登录表单action属性的next
变量,因此它看起来像/your_login_url/?next=/myblog/
,当你提交表单你得到登录和重定向到/myblog/
(if request.method == 'POST':
后的东西被执行)。
在你看来,redirect_to = request.REQUEST.get("next")
正常工作时,你只GET
登录页面,但是当你POST
它没有在GET变量next
集。
同时注意
登录而不应该使你的博客,博客查看应该这样做。
这是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
评估为真?
也许,如果我们教人以渔? 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'
的内容