Django:CSRF令牌缺失或不正确
我是Django的新手!我在网上试了几乎所有的解决方案,但在Chrome浏览器上仍然出现“缺少或不正确的CSRF令牌”的错误,而在Opera和Firefox上则显示“CSRF cookie未设置”...?以下是我的文件:
views.py
# views.py
from django.shortcuts import render_to_response
from django.http import HttpResponse, HttpResponseRedirect
from django.contrib.auth import authenticate, login
from django.template import RequestContext
from django.core.context_processors import csrf
def dashboard(request):
state = "log in"
if request.user.is_authenticated():
return render_to_response('memberbrd.html')
elif request.method == "POST":
username = request.POST.get('username')
password = request.POST.get('password')
user = authenticate(username=username, password=password)
if user is not None:
if user.is_active:
login(request, user)
return HttpResponseRedirect('/')
else:
error = "inactive"
else:
error = "wrong username or password"
render_to_response('visitorbrd.html', {'errors': error}, context_instance = RequestContext(request)) # I've also tried without context_instance, without passing errors...
else:
return render_to_response('visitorbrd.html')
urls.py
#urls.py
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
from mission.views import *
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^$', dashboard),
)
visitorbrd.html
{% extends "base.html" %}
{% block content %}
{% if state %}
<p>{{ state }}</p>
{% endif %}
<form action="." method="POST">{% csrf_token %}
<label for="username">User name:</label>
<input type="text" name="username" value="" id="username">
<label for="password">Password:</label>
<input type="password" name="password" value="" id="password">
<input type="submit" value="login" />
<input type="hidden" name="next" value="{{ next|escape }}" />
</form>
{% endblock %}
谢谢!
2 个回答
1
之前的回答是完全正确的。其实,输出表单的时候并不一定需要用到 RequestContext,这个工作是由 Form 类来处理的。问题在于,需要通过请求生成一个新的 CSRF Token,而这个过程是通过 Django 的中间件来完成的。中间件只能访问上下文变量,所以按照这个逻辑,它需要 RequestContext 来实现这个功能。
顺便提一下,我更喜欢 Django 的 "render" 函数,而不是 "render_to_response"。虽然有时候这个函数太通用了,但对于新手来说,少打字是很方便的,而且代码看起来也更整洁。我从 Django 的官网上复制了这个例子(下面我会附上一个永久链接)。
from django.shortcuts import render
def my_view(request):
# View code here...
return render(request, 'myapp/index.html', {"foo": "bar"},
content_type="application/xhtml+xml")
3
你没有在最后的 render_to_response
中使用 RequestContext
,而这个 render_to_response
是用来真正显示表单的。