CSRF验证失败。请求中止。不寻常的情况

时间:2015-04-09 00:28:39

标签: django django-forms django-csrf

我认为此错误的问题隐藏在模板中。这是我的表格:

<form class="form-horizontal loginFrm" action="/login/" method="post">
              {% csrf_token %}
              <div class="control-group">                               
                <input type="text" id="inputEmail" placeholder="Email" name = "username">
              </div>
              <div class="control-group">
                <input type="password" id="inputPassword" placeholder="Password" name = "password">
              </div>
              <div class="control-group">
                <label class="checkbox">
                <input type="checkbox"> Remember me
                </label>
              </div>
              <input type="submit" class="btn btn-success" value="Sign in">
            </form>     

            <button class="btn" data-dismiss="modal" aria-hidden="true">Close</button>

我的login观点:

def login(request):
    args = {}
    args.update(csrf(request))
    if request.POST:
        username = request.POST['username']
        password = request.POST['password']
        user = auth.authenticate(username=username, password=password)
        if user is not None:
            auth.login(request, user)
            args['username'] = username
            return HttpResponseRedirect('/', args, context_instance=RequestContext(request))
        else:
            return HttpResponseRedirect('/', args, context_instance=RequestContext(request))
    else:
        return HttpResponseRedirect('/',args,context_instance=RequestContext(request))

在我的上一个项目中,它工作正常。但这是错误。

2 个答案:

答案 0 :(得分:0)

使用呈现的登录表单查看页面上的html源代码,并确认您有一个带有csrf令牌的隐藏字段。

这样的事情:

<input type='hidden' name='csrfmiddlewaretoken' value='NzYXoXbN9beogdB6gf22rNXkTNQd6Jri' />

您的视图可能没有传递context_instance。这取决于您首先使用哪种方法渲染视图。

您可以使用:

return render_to_response('my_template.html',
                           context_instance=RequestContext(request))

或者更简单的render()将自动使用RequestContext

return render(request, 'my_template.html')

答案 1 :(得分:0)

作为案例,您可以使用ensure_csrf_cookie视图装饰器。