2011-11-11 112 views
15

Django初学者在这里,我一直试图解决这个很长一段时间。 我在我的中间件类中有'django.middleware.csrf.CsrfViewMiddleware',并且在我的表单中有确实的标记。CSRF令牌缺失或不正确

继承人我的代码,我做错了什么?

from django.contrib.auth.forms import UserCreationForm 
from django.shortcuts import render_to_response 
from django.http import HttpResponseRedirect 
from chartsey.authentication.forms import RegistrationForm 
from django.template import RequestContext 
from django.core.context_processors import csrf 

def register(request): 

    if request.method == 'POST': 
     c = RequestContext(request.POST, {}) 
     form = RegistrationForm(c) 
     if form.is_valid(): 
      new_user = form.save() 
      return HttpResponseRedirect("/") 
    else: 
     form = RegistrationForm() 

    return render_to_response("register.html", {'form': form, },) 

这里是我的模板:

{% block content %} 

    <h1>Register</h1> 
    <form action="" method="POST"> {% csrf_token %} 
     {{ form.as_p }} 
    <input type="submit" value="Submit"> 
    </form> 

{% endblock %} 
+0

的可能重复注释掉下面的行[Django的:CSRF令牌丢失或不正确(http://stackoverflow.com/questions/8321217/ django-csrf-token-missing-or-incorrect) – lracicot

回答

21

我的猜测是,你必须在模板中的标签,但它没有渲染任何东西(或你的意思是你在实际HTML,一个CSRF令牌确认产生?)

要么使用RequestContext代替字典

render_to_response("foo.html", RequestContext(request, {})) 

或确保您的django.core.context_processors.csrf在您的CONTEXT_PROCESSORS设置中。

https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

Or add the token to your context manually

+0

这样做!我完全理解它仍然有点麻烦,但至少我过去茫然地看着,试图随机改变事情。这些文档对我没有太大的帮助,非常感谢! – arooo

+0

这是文档中的第3步:)如果你让自己挖一点点,Django的文档是惊人的。祝你好运! –

+0

非常感谢,这解决了我的问题。对每个人的一般建议:检查用户render_to_response()与正确的参数,我搞砸了,给它3个参数,因此它导致了上述错误。 – Phonebox

5

只需添加到您的意见

return render_to_response("register.html", {'form': form, }, context_instance = RequestContext(request))

它将工作!

0

如果您不使用CsrfViewMiddleware,那么您必须在任何使用csrf_token模板标记的视图以及接受POST数据的视图上使用csrf_protect。

0

如@Yuji'Tomita'Tomita和@Njogu Mbau所述,RequestContext的使用是使用render_to_response的关键。然而,当我遇到这个问题时,最初抛弃我的是,我必须将RequestContext添加到views.py中的函数中,该函数最初将模板加载到处理从模板提交的views.py中的函数中。

此外,仅供参考,这里是讨论这个同样的问题,其他一些链接

0

在我安装了django-livereload-server之后,在一些页面上也随机得到了这个错误。卸载django-livereload-server的确有窍门。

-1

什么工作对我来说是从我settings.py

'django.middleware.csrf.CsrfViewMiddleware'

相关问题