【问题标题】:CSRF Token missing or incorrectCSRF 令牌丢失或不正确
【发布时间】:2011-12-26 17:10:50
【问题描述】:

这里是 Django 的初学者,我已经尝试解决这个问题很长时间了。 我的中间件类中确实有“django.middleware.csrf.CsrfViewMiddleware”,并且我的帖子表单中确实有令牌。

这是我的代码,我做错了什么?

from django.contrib.auth.forms import UserCreationForm
from django.shortcuts import render_to_response
from django.http import HttpResponseRedirect
from chartsey.authentication.forms import RegistrationForm
from django.template import RequestContext
from django.core.context_processors import csrf

def register(request):

    if request.method == 'POST':
        c = RequestContext(request.POST, {})
        form = RegistrationForm(c)
        if form.is_valid():
            new_user = form.save()
            return HttpResponseRedirect("/")
    else:
        form = RegistrationForm()

    return render_to_response("register.html",  {'form': form,  }, )

这是我的模板:

{% block content %}

    <h1>Register</h1>
    <form action="" method="POST"> {% csrf_token %}
        {{ form.as_p }}
    <input type="submit" value="Submit">
    </form>

{% endblock %}

【问题讨论】:

标签: python django django-forms csrf


【解决方案1】:

DJANGO/AJAX 工作流程完整方法在这里 :)

const url = "{% url 'YOUR_URL_NAME' pk=12345 %}".replace(/12345/, id.toString());
$.ajax({
        type: 'POST',
        url: url,
        data: {'id':id, "csrfmiddlewaretoken": '{{csrf_token}}'},
        beforeSend: function() { $('#response').text('Please wait ...'); },
        success: function (response) {
            console.log(response)           
        },
        error: function (response) {
            console.log(response)
        }
    })

希望能成功!!!

【讨论】:

    【解决方案2】:

    我也遇到了这个问题,但老实说,几分钟后我在浏览器上点击了刷新,没有进行任何更改,并且当时它确实有效。我在命令行中收到了这条消息,因此它可能会为导致问题的原因提供线索:

    Not Found: /css/reset/reset.css
    [03/Jul/2020 20:52:13] "GET /css/reset/reset.css HTTP/......
    

    【讨论】:

      【解决方案3】:

      对于 Django 3.0 版添加以下注释

      @csrf_protect
      def yourfunc(request):
          return render(request, '../your.html', None)
      

      别忘了在你的字段中添加以下标签

      <form action="add/" method="post">
        {% csrf_token %}
      ...
      </form>
      

      【讨论】:

        【解决方案4】:

        更新:这个答案来自 2011 年。CSRF 今天很容易。

        这些天你应该使用render 快捷功能return render(request, 'template.html'),它会自动使用RequestContext,所以下面的建议已经过时了 8 年。

        1. 使用renderhttps://docs.djangoproject.com/en/2.2/topics/http/shortcuts/
        2. 添加CSRF中间件https://docs.djangoproject.com/en/2.2/ref/csrf/
        3. 使用{% csrf_token %}模板标签
        4. 确认您看到 CSRF 令牌值正在生成,并在您的表单请求中提交

        原始回复

        我的猜测是您在模板中有标签,但它没有呈现任何内容(或者您的意思是您在实际的 HTML 中确认正在生成 CSRF 令牌?)

        使用RequestContext 代替字典

        render_to_response("foo.html", RequestContext(request, {}))
        

        或者确保您的CONTEXT_PROCESSORS 设置中有django.core.context_processors.csrf

        https://docs.djangoproject.com/en/dev/ref/contrib/csrf/

        Or add the token to your context manually

        【讨论】:

        • 做到了!我仍然很难完全理解它,但至少我已经过去茫然地盯着并试图随机改变事物。文档对我帮助不大,非常感谢!
        • 这是文档中的第 3 步 :) 如果您让自己深入挖掘一下,Django 的文档会非常棒。祝你好运!
        • 非常感谢,这解决了我的问题。给大家的一般建议:检查您是否使用正确的参数使用render_to_response(),我搞砸了并给了它3个参数,因此导致了上述错误。
        【解决方案5】:

        对我有用的是从我的settings.py 中注释掉以下行

        'django.middleware.csrf.CsrfViewMiddleware'

        【讨论】:

        • 这只是完全删除了 CSRF 保护;它没有解决实际问题。
        【解决方案6】:

        在我安装 django-livereload-server 后,某些页面上也随机出现此错误。卸载 django-livereload-server 就可以了。

        【讨论】:

          【解决方案7】:

          尝试使用 render 而不是 render_to_response

          from django.shortcuts import render
          
          render(request, "foo.html", {})
          

          Django - what is the difference between render(), render_to_response() and direct_to_template()?

          如上面链接中所述,它是在 Django 1.3 中引入的,并自动使用 RequestContext

          【讨论】:

            【解决方案8】:

            @Yuji 'Tomita' Tomita 和@Njogu Mbau 提到,在使用render_to_response 时,添加RequestContext 是关键。然而,当我遇到这个问题时,最初让我失望的是,我必须将 RequestContext 添加到 views.py 中最初加载模板的函数和 views.py 中处理来自模板。

            另外,仅供参考,这里有一些讨论相同问题的其他链接

            【讨论】:

              【解决方案9】:

              如果您没有使用 CsrfViewMiddleware,那么您必须在任何使用 csrf_token 模板标签的视图以及接受 POST 数据的视图上使用 csrf_protect。

              【讨论】:

                【解决方案10】:

                只需将此添加到您的视图中

                return render_to_response("register.html", {'form': form, }, context_instance = RequestContext(request))

                它会起作用的!

                【讨论】:

                  猜你喜欢
                  • 2021-07-14
                  • 2014-03-29
                  • 1970-01-01
                  • 2014-12-25
                  • 2014-02-26
                  • 2021-10-01
                  • 2021-11-13
                  • 2012-04-20
                  • 2012-09-25
                  相关资源
                  最近更新 更多