3

这是我的登录视图:

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 进行登录时,我被重定向到 /blogs/ 而不是 /myblog/

为什么 ?

编辑: request.REQUEST.get('next', '') 总是返回 ''

我不知道为什么:-\

4

2 回答 2

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登录表单操作属性中的变量,所以它看起来像/your_login_url/?next=/myblog/当你提交表单时你登录并重定向到/myblog/if request.method == 'POST':执行后的东西) .

在您看来,redirect_to = request.REQUEST.get("next")当您只有GET登录页面时工作正常,但当您访问它时,GETPOST中没有设置变量。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))

而且,您似乎只为默认重定向覆盖登录视图?这不对恕我直言。通过设置LOGIN_REDIRECT_URL在 settings.py 中设置登录重定向的默认位置的正确位置。

但是,既然您正在编写自己的登录视图,为什么不使用 django 中的登录视图作为骨架,然后在其上扩展您需要的内容。

于 2010-05-13T11:20:14.370 回答
1

因为

 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'的内容

于 2010-05-13T09:24:59.967 回答