Django CSRF验证失败。请求已中止.-未设置CSRF cookie

时间:2014-02-01 13:33:58

标签: django django-forms

我知道之前已经问过这个问题。我已经尝试了几乎所有人给出的选项,但我似乎无法解决它。我是一个完整的新手所以请让我知道我哪里出错了。

我正在尝试编写一个简单的原始表单。到目前为止,我还没有实现任何身份验证或会话机制(但是从我读过的内容来看这个问题并不重要。如果我错了,请纠正我。)

当我尝试提交表单时,我收到此错误:

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。

1 个答案:

答案 0 :(得分:6)

您的CSRF设置很好。问题是您没有返回结果。请记住,视图是一个功能。您需要return render_to_response(...)而不仅仅是调用它(这也是为什么通过删除CSRF导致didn't return an HttpResponse错误)

除此之外,你正在做一些同样错误的一般事情:

因此:

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', {})