【问题标题】:CSRF token missing or incorrect (I know, its been asked before!)CSRF 令牌丢失或不正确(我知道,它之前被问过!)
【发布时间】:2012-03-01 13:42:17
【问题描述】:

两天时间在 Google、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.")

【问题讨论】:

  • -1:“我知道,以前有人问过!”但是您拒绝搜索或引用它?太粗鲁了。
  • 抱歉显得粗鲁。但是我查看了所有提出的问题和提供的所有答案,并觉得在同一问题上添加另一个问题是错误的,但我别无选择。实际上,目的是告诉窥视者,我很欣赏这个问题是重复的,但对我的具体情况没有答案。我的坏
  • 你有多个 Django 站点在 Apache 下的 mod_wsgi 中运行吗?
  • @S.Lott:没有。只有一个站点。我什至还没有设置Apache。使用 django 附带的默认 Web 服务器。谢谢。
  • 还有两件事。 (1) 复制和粘贴代码时要非常小心。您的 MIDDLEWARE_CLASSES 缺少一些引号。要么你的代码不好,要么你没有仔细复制和粘贴。 (2) 由于您在使用RequestContext 时遇到问题,您需要查看docs.djangoproject.com/en/1.3/ref/templates/api/…。您发布的代码与文档完全相同。

标签: python django csrf


【解决方案1】:

render_to_response 的签名是render_to_response(template_name[, dictionary][, context_instance][, mimetype]),所以您应该像下面这样调用它以确保将 csrf 令牌放入上下文中吗?

return render_to_response('vehicle.html', {}, context_instance= RequestContext(request))`

【讨论】:

  • @lukik:请在问题中包含错误消息作为更新。不要将关键事实添加为 cmets。
  • @lukik:您发布的代码与此答案完全相同。请修复您的代码并更新问题以显示您实际使用的实际代码。
  • @S.Lott:感谢您的耐心等待!我没有重新格式化就重吃了。
  • 这是正确的——你不能只使用RequestContext 实例作为render_to_response 的随机参数。它需要是第三个未命名参数,或者需要明确命名为“context_instance”。
  • @lukik:您知道问题中的add_vehicle 函数仍然是问题的根源吗?您评论中的“我已经完全按照您的说法”是不正确的;请删除评论。
【解决方案2】:

您应该查看此文档 https://docs.djangoproject.com/en/dev/ref/contrib/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', )'
  • @lukik:请在问题中包含代码示例作为更新。不要在 cmets 中添加代码。
猜你喜欢
  • 2021-07-14
  • 2011-12-26
  • 2014-03-29
  • 1970-01-01
  • 2014-12-25
  • 2014-02-26
  • 2021-10-01
  • 2021-11-13
  • 2012-04-20
相关资源
最近更新 更多