登录和重定向

时间:2010-05-13 09:17:08

标签: django django-forms django-login

这是我的登录视图:

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','')总是返回''

我不知道为什么: - \

2 个答案:

答案 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返回的响应的样子,注意它所说的行nextredirect_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'的内容