我知道这个问题以前曾被问过。我已经尝试了人们提供的几乎所有选项,但似乎无法解决。我是一个完全的新手,所以请让我知道我要去哪里错了。
我正在尝试编写一个简单的原始表格。到目前为止,我还没有实现任何身份验证或 session 机制(但是从我读到的内容来看,这个问题无关紧要。如果我错了,请纠正我)。
当我尝试提交表单时,出现以下错误:
Forbidden (403)
CSRF verification failed. Request aborted.
Reason given for failure:
CSRF cookie not set.
这是我的代码:
我的Views.py具有以下方法:
def submit(request):
global alphabet_array
dishes = Dish.objects.all().order_by('name')
if request.method == "POST":
print request.POST['restaurant']
print request.POST['rating']
render_to_response('index.html', {}, context_instance=RequestContext(request))
else:
render_to_response('index.html', {}, context_instance=RequestContext(request))
许多人已经说过,使用RequestContext可以解决此问题,但对我来说,这是行不通的。
该模板如下所示:
<form role="form" action="/submit/" method="post">{% csrf_token %}
<div class="form-group">
<label for="">Restaurant Name</label>
<input type="text" name="restaurant" class="form-control" id="">
</div>
<div class="form-group">
<label for="">Rating</label>
<select class="form-control" name="rating">
<option>--</option>
<option>1 (very bad)</option>
<option>2 (bad)</option>
<option>3 (average)</option>
<option>4 (good)</option>
<option>5 (excellent)</option>
</select>
</div>
<button type="submit" class="btn btn-primary btn-block"><i class="fa fa-check-circle"></i> Save</button>
</form>
settings.py中的middleware_classes看起来像:
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
)
django.middleware.csrf.CsrfViewMiddleware在这里,并且在“django.contrib.sessions.middleware.SessionMiddleware”之下
我的url.py有条目:
url(r'^admin/', include(admin.site.urls)),
url(r'^index/$', 'testapp.views.index'),
url(r'^starts_with/(?P<alphabet>.+)/dish/(?P<dish_id>\d+)/$', 'testapp.views.alphabet_dish'),
url(r'^starts_with/(?P<alphabet>.+)/$', 'testapp.views.alphabet'),
url(r'^submit/$', 'testapp.views.submit'),
我真的不确定这是什么问题。正如我所说,我在这里阅读过类似的帖子,并尝试了回复中提到的所有内容。我错过了什么?我的浏览器是Chrome,并且它接受Cookie。
最佳答案
您的CSRF设置很好。问题是,您没有返回结果。请记住, View 是一个函数。您不仅需要调用return render_to_response(...)
(这也是为什么删除CSRF会导致didn't return an HttpResponse
错误的原因)
除此之外,您正在做一些一般性的错误,这些错误是django-ically错误的:
因此:
def submit(request):
# global alphabet_array
dishes = Dish.objects.all().order_by('name')
if request.method == "POST":
print request.POST['restaurant']
print request.POST['rating']
return render(request, 'index.html', {})
关于Django CSRF验证失败。请求中止。-未设置CSRF cookie,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21498682/