缺少或错误的CSRF令牌(我知道,之前有人问过!)
我已经花了两天时间在谷歌、StackOverflow和docs.djangoproject.com上寻找解决CSRF问题的方法。
声明一下,我是Django的新手,正在跟着一本书《Django权威指南 - 正确的网页开发》学习。看起来我好像哪里搞错了 :-(
下面是我尝试的一种方法,看看你能不能指出我哪里出错了,因为我已经试过StackOverflow上的所有建议,但还是没有成功:
view.py:
from django.shortcuts import render_to_response
from django.template import RequestContext
def add_vehicle(request):
return render_to_response('vehicle.html', RequestContext(request, {}))
vehicle.html:
{% extends "base.html" %}
{% block title %}Vehicle Registration{% endblock %}
{% block content %}
<html>
<head>
</head>
<body>
<form action="/vehicle/" method="post"> {% csrf_token %}
<table width=100%>
<tr>
<td>Reg #:</td>
<td><input type="text" name="regnumber"></td>
<td></td>
</tr>
<tr>
<td>Model:</td>
<td><input type="text" name="model"></td>
<td></td>
</tr>
<tr>
<td>Manufacturer:</td>
<td><input type="text" name="manufacturer"></td>
<td></td>
</tr>
<tr>
<td>Year:</td>
<td><input type="text" name="year"></td>
<td></td>
</tr>
<tr>
<td>Chassis #:</td>
<td><input type="text" name="chasisnumber"></td>
<td></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="Submit">
<input type="submit" value="Clear">
</td>
<td></td>
</tr>
</table>
</form>
</body>
</html>
{% endblock %}
希望这些代码对StackOverflow来说不会太多。
现在,我一直收到CSRF令牌缺失或不正确的错误。
请帮帮我。
编辑(添加错误的详细信息)
settings.py看起来是这样的:
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',
)
这是我打开vehicle.html页面时控制台显示的内容:
warnings.warn("A {% csrf_token %} was used in a template, but the context did not provide the value. This is usually caused by not using RequestContext.")
2 个回答
0
你应该看看这个文档:https://docs.djangoproject.com/en/dev/ref/contrib/csrf/
你可能缺少了中间件。
4
render_to_response的使用方式是 render_to_response(template_name[, dictionary][, context_instance][, mimetype])
,所以你应该像下面这样调用它,以确保csrf令牌被放入上下文中吗?
return render_to_response('vehicle.html', {}, context_instance= RequestContext(request))`