CSRF令牌缺失或不正确,尽管我有{% csrf_token %}

10 投票
2 回答
9586 浏览
提问于 2025-04-16 17:11

我在我的views.py文件中遇到了一个错误,跟这个方法有关:

def AddNewUser(request):
    a=AMI()
    if(request.method == "POST"):
        print(request.POST)
       # print(request['newUser'])
       # print(request['password'])
    return render_to_response("ac/AddNewUser.html", {})

不过我其他的函数都运行得很好。就只有我HTML文件中的这个按钮不工作。

<form name="AddNewUser" action="/ac/AddNewUser" method="post"> {% csrf_token %} <input type="submit" name="addNewUser" id="addNewUser" value="Create User"></form>

如你所见,我已经加上了{% csrf_token %},但它还是不工作。我还知道,有些人如果在settings.py中没有MIDDLEWARE_CLASSES也会遇到这个问题,但我已经正确地插入了这个设置。那可能是什么原因呢?错误信息中还有一句话:“视图函数使用了RequestContext来渲染模板,而不是Context。”但我不知道这是什么意思。

2 个回答

2

注意:RequestContext 必须在提供表单的视图和接收提交的视图中都使用。如果你按照上面的步骤操作了,但还是不行,那可能就是这个问题!对我来说确实是这样。

13

你需要使用一个叫做 RequestContext 的对象来获取上下文,然后把结果传递给你的 render_to_response() 函数。RequestContext 会添加一个必需的 CSRF 令牌。

from django.template import RequestContext
from django.shortcuts import render_to_response

csrfContext = RequestContext(request)
return render_to_response(some_template, csrfContext)

顺便提一下,你还可以使用 RequestContext 来添加一些供模板使用的上下文或字典。例如,我经常使用:

initialData = {'form': theForm, 'user_status': 'online'}
csrfContext = RequestContext(request, initialData)
return render_to_response(show_template, csrfContext)

简单来说,RequestContext 的作用是:大多数中间件会创建一个叫做 context processor 的东西,这其实就是一个提供上下文(字典)变量的函数。RequestContext 会查找所有可用的上下文处理器,获取它们的上下文,然后把这些上下文都合并到一个大的上下文中。

撰写回答