Django为什么我还有CSRF验证失败?

时间:2013-07-27 04:34:57

标签: django django-forms django-csrf

我的模板如下:

  <div id="divLogin">
                {% block login %}
                <form action="/login" method="post">
                    {% csrf_token %}
                    <label for="id_name"></label><input type="text" name="email" id="id_name" placeholder="Your Email">
                    <label for="id_pass"></label><input type="password" name="password" placeholder="Your Password">
                    <input type="submit" id="btnLogin" value="Log In" class="btn">
                </form>
                {% endblock %}
            </div>

我已在模板中添加{%csrf_token%},我的登录视图是

def login_view(request):
    if request.method == 'POST':
        useremail=request.POST['email']
        password=request.POST['password']
        try:
            user=User.objects.get(email=useremail)
            if user.check_password(password):
                uAuth=authenticate(username=user.username,password=password)
                login(request,uAuth)
                return render_to_response("blog.html",{'loginuser':user},context_instance=RequestContext(request))
        except User.DoesNotExist:
            return redirect('/')
    return redirect('/')

即使我使用了render_to_responseRequestContext,我仍然会遇到错误。 有一件事非常有线,我给login_view方法设置了一个断点,但是在进入login_view方法之前csrf错误指出了。所以对这种方法没有反应?

我的代码有什么问题吗?

我在{settings {。}中的django.middleware.csrf.CsrfViewMiddleware添加了MIDDLEWARE_CLASSES

1 个答案:

答案 0 :(得分:0)

您必须在post之后使用重定向。

重定向到呈现模板的视图。

def login_view(request):
    if request.method == 'POST':
        useremail=request.POST['email']
        password=request.POST['password']
        try:
            user=User.objects.get(email=useremail)
            if user.check_password(password):
                uAuth=authenticate(username=user.username,password=password)
                login(request,uAuth)
                return HttpResponseRedirect('/someurl')
        except User.DoesNotExist:
             return redirect('/')
    else:
        return render_to_response('login.html',context_instance=RequestContext(request))


def someurl(request):
    if request.method == 'GET':
         render_to_response("blog.html",    
               {'loginuser':user},context_instance=RequestContext(request))