我在使用我的形式POST即使我已经加了csrf_token到我的形式得到一个错误....Django的POST请求无
错误
禁止(403)
CSRF验证失败。请求中止。对未给予
帮助
原因: CSRF的cookie未设置。
一般而言,如果存在真正的跨站点请求伪造,或者Django的CSRF机制未正确使用,则可能发生这种情况。对于POST表单,您需要确保: •您的浏览器正在接受cookie。 •视图函数使用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),