[英]Django POST request failing
我在表单中使用POST时出现错误,即使我已将csrf_token添加到我的表单中....
错误
禁止的(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),
你想在这里看到第3点。 你正在返回一个简单的HttpResponse,所以我认为正在跳过csrf上下文处理器。 您可能需要考虑使用django.shortcuts.render 。 此外,在您的模板中,您的表单方法是“发布”,但在您的视图中,您正在检查request.GET。 这与您所拥有的CSRF问题无关,但可能是您想要解决的问题。
您尚未将令牌添加到表单中。
您已添加代码{% csrf_token %}
,但未使用django.core.context_processors.csrf
,因此模板标记实际上并未输出任何内容(模板标记无提示失败)。
而不是使用HttpResponse
,你需要render_to_response()这个 (用的RequestContext )或只是渲染() (它处理的RequestContext你)。
另外,您不需要两个视图。 search
应处理渲染表单和处理表单 -
来自django.shortcuts导入渲染
def search(request):
if request.method == POST:
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.POST['q']
else:
message = 'You submitted an empty form'
return render(request, 'search_form.html', {'message': message})
return render(request, 'search_form.html')
然后将{{ message }}
变量添加到search_form.html
模板中 - 可能在某种if语句中实现您现在正在执行的操作 -
<body>
{% if message %}
<div> {{ message }} </div>
{% else %}
<form action="/polls/search/" method="post">{% csrf_token %}
<input type="text" name="q">
<input type="submit" value="Search">
</form>
{% endif %}
</body>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.