CSRF令牌丢失或不正确

时间:2011-11-11 03:10:20

标签: python django django-forms csrf

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 %}

9 个答案:

答案 0 :(得分:23)

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

这些天你应该使用自动使用render的{​​{1}}快捷方式功能return render(request, 'template.html'),以便下面的建议过时8年。

  1. 使用RequestContext https://docs.djangoproject.com/en/2.2/topics/http/shortcuts/
  2. 添加CSRF中间件https://docs.djangoproject.com/en/2.2/ref/csrf/
  3. 使用render模板标记
  4. 确认您看到生成的CSRF令牌值,并在表单请求中提交
  5. 原始回复

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

    使用{% csrf_token %}代替字典

    RequestContext

    或确保render_to_response("foo.html", RequestContext(request, {})) 设置中有django.core.context_processors.csrf

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

    Or add the token to your context manually

答案 1 :(得分:6)

只需将此添加到您的观看次数

即可

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

它会起作用!!

答案 2 :(得分:4)

尝试使用呈现而不是 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

答案 3 :(得分:0)

如果您不使用CsrfViewMiddleware,则必须在使用csrf_token模板标记的任何视图以及接受POST数据的视图上使用csrf_protect。

答案 4 :(得分:0)

使用RequestContext时,添加render_to_response是@Yuji&#39; Tomita&#39; Tomita和@Njogu Mbau。但是,当我遇到这个问题时最初让我失望的是,我必须将RequestContext添加到views.py中最初加载模板的函数和views.py中的函数处理模板提交的内容。

另外,仅供参考,以下是讨论同样问题的其他一些链接

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我也遇到了这个问题,但是老实说,几分钟后,我在浏览器上单击了刷新,而没有进行任何更改,并且在那个时候起作用了。我在命令行中收到了此消息,因此它可以提供有关导致问题的原因的线索:

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

答案 7 :(得分:0)

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)
        }
    })

希望它会奏效!!!

答案 8 :(得分:-1)

对我来说有用的是从我的settings.py

中评论下面一行

'django.middleware.csrf.CsrfViewMiddleware'

相关问题