当我使用@login_required装饰视图时,我如何匹配?next = / nextpage / value?

时间:2011-07-13 13:44:43

标签: python django

当我使用@login_required装饰django中的视图时,如何匹配?next = / nextpage / value? 它不是在“标准方式”上工作(通过正则表达式匹配在url.py中)! 为什么它不按标准方式工作?

在urls.py中

(r'^login/$', 'foo.nb.views.signup'),
#(r'^login/?next=(?P<next>\S{1,250})$', 'foo.nb.views.signup'),
在views.py中

@login_required
def userpage(request):
    return HttpResponse('logged in -> ON USERPAGE')

再次发表观点.py:

#def signup(request, next=""): # the login
 def signup(request): # the login
    """ Logs a user in """
    if request.method=="POST" and request.POST['username'] and request.POST['password']:
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(username=username, password=password)

            if user is not None:
                if user.is_active:
                    login(request, user)
                    #return redirect(next) # to sucess page
                     return redirect(request.GET['next']) # to sucess page
                else:
                    pass
                    # Return to disabled account error message
            else:
                # return invalid login error message
                pass
    return render_to_response('NBlogin.html')

当我访问views.userpage时,我将被重定向到我的登录页面作为expectet,并且url有下一个字段,如/ login /?next = / oldpage /,当我使用正确的用户登录时收到错误消息告诉我没有传递下一个变量(用户,密码设置)既不作为post,(但登录工作正常,如预期的那样)

编辑:Django 1.2: login issue (GET parameter: next)有相同的主题,但我没有看到解决方案...

edit2:更改为request.GET ['next']后,错误消息显示:

Key 'next' not found in <QueryDict: {}>

EDIT3:

我不得不像这样更改视图:

def signup(request): # the login
    """ Logs a user in """

    if request.method=="GET":
            try:   
                    next = request.GET['next']
            except:
                    return render_to_response('NBlogin.html')
            return render_to_response('NBlogin.html',{'next' : next})

    if request.method=="POST" and request.POST['username'] and request.POST['password']:
            username = request.POST['username']
            password = request.POST['password']
            user = authenticate(username=username, password=password)

            if user is not None:
                if user.is_active:
                    login(request, user)
                    return redirect(request.POST['next']) # to sucess page
                else:
                    pass
                    # Return to disabled account error message
            else:
                # return invalid login error message
                pass

    return render_to_response('NBlogin.html')

我不得不在我的模板中添加一个隐藏字段,就是这样!:

<form action="/login/" method="post">
        <p>Username:<input type="text" name="username"></p>
        <p>Password:<input type="password" name="password">
        <input type="hidden" name="next" value="{{next}}">
        <input type="submit" value="login"></p>
</form>

1 个答案:

答案 0 :(得分:1)

Django只根据URL的路径匹配路径,而不是查询字符串。

这意味着'?'之后的任何事情在决定要提供哪个视图时,不会考虑来自服务器的请求。相反,字符串的那部分变成了像对象一样的字典。

所以如果你要求:

/login/?next=/nextpage/

Django将使用/login/查找视图,并使用数据request.GET填充{'next':'nextpage'}。告诉我们你真正要做的事情,我会尝试找到更多Django式的方式来实现它。

在提供其他信息后进行修改:

使用POST方法提交表单时,可能没有发送查询字符串?next=/nextpage/。提交表单会将数据POST到表单的action属性中指定的URL。