在使用Django提交Post表单时遇到以下错误:html
缘由在"帮助"中已经写的很清楚了。python
通常而言,这能够发生时,有一个真正的跨站请求伪造,或当Django的CSRF的机制尚未正确使用。 对于POST表单,您须要确保:django
*该视图功能使用模板RequestContext的。session
*在模板中,有{%csrf_token%}(模板网址标记在每一个邮局形式的内部目标。spa
*若是您不使用CsrfViewMiddleware,那么你必须在view中使用csrf_protect,
.net
您看到此页面的帮助部分,由于你在settings中设置了 DEBUG = True。 改变这种情况为False,只有最初的错误信息会被显示。您可使用CSRF_FAILURE_VIEW设置自定义此页面。code
因此,解决方法:orm
一、在表单Form里加上{% csrf_token %}
csrf
二、在Settings里的
htmMIDDLEWARE_CLASSES增长配置:(通常默认就有)
'django.middleware.csrf.CsrfViewMiddleware',
#'django.middleware.csrf.CsrfResponseMiddleware',
1.2.X示例:
三、在view中的方法上面加上@csrf_protect注解。同时使用RequestContext代替Context。示例:
----------------------------------------------------------------------------------------------------------------------------------
@csrf_protect
def login(request):
...
return render_to_response('index.html',context_instance=RequestContext(request))
----------------------------------------------------------------------------------------------------------------------------------
详情:
https://docs.djangoproject.com/en/1.2/ref/contrib/csrf/
https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ref-contrib-csrf
扩展阅读:
django.contrib.csrf 开发包只有一个模块: middleware.py 。该模块包含了一个 Django 中间件类——CsrfMiddleware ,该类实现了 CSRF 防御功能。
在设置文件中将 'django.contrib.csrf.middleware.CsrfMiddleware' 添加到 MIDDLEWARE_CLASSES 设置中可激活 CSRF 防御。 该中间件必须在 SessionMiddleware 以后 执行,所以在列表中 CsrfMiddleware 必须出如今SessionMiddleware 以前 (由于响应中间件是自后向前执行的)。 同时,它也必须在响应被压缩或解压以前对响应结果进行处理,所以 CsrfMiddleware 必须在 GZipMiddleware 以后执行。一旦将它添加到MIDDLEWARE_CLASSES设置中,你就完成了工做。