【发布时间】:2013-02-08 18:06:29
【问题描述】:
在我的表单中使用 POST 时出现错误,即使我在表单中添加了 csrf_token....
错误
禁止 (403)
CSRF 验证失败。请求中止。
帮助
失败的原因: CSRF cookie 未设置。
一般来说,当有真正的跨站请求伪造时,或者没有正确使用 Django 的 CSRF 机制时,就会发生这种情况。对于 POST 表单,您需要确保: •您的浏览器正在接受cookies。 • 视图函数使用RequestContext 作为模板,而不是Context。 • 在模板中,每个 POST 表单内都有一个 {% csrf_token %} 模板标签,以内部 URL 为目标。 • 如果您没有使用 CsrfViewMiddleware,那么您必须在任何使用 csrf_token 模板标签的视图以及接受 POST 数据的视图上使用 csrf_protect。
您看到此页面的帮助部分是因为您的 Django 设置文件中有 DEBUG = True。将其更改为 False,将仅显示初始错误消息。
您可以使用 CSRF_FAILURE_VIEW 设置自定义此页面。
views.py
def search_form(request):
return render_to_response('search_form.html')
def search(request):
print 'request.post=', request.POST
print 'request.get=', request.GET
print 'request.method=', request.META.get('REQUEST_METHOD')
if 'q' in request.GET:
message = 'You searched for :%r' % request.GET['q']
else:
message = 'You submitted an empty form'
return HttpResponse(message)
search-form.html
<html>
<head>
<title>Search</title>
</head>
<body>
<form action="/polls/search/" method="post">{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="Search">
</form>
</body>
</html>
urls.py
urlpatterns = patterns('',url(r'^$',views.index,name='index'),
url(r'^meta/',views.display_meta,name='meta'),
url(r'^search-form/$',views.search_form),
url(r'^search/',views.search),
【问题讨论】: