Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python CSRF令牌丢失或不正确_Python_Django_Django Forms_Csrf - Fatal编程技术网

Python CSRF令牌丢失或不正确

Python CSRF令牌丢失或不正确,python,django,django-forms,csrf,Python,Django,Django Forms,Csrf,作为Django的初学者,我已经尝试解决这个问题很久了。 在我的中间件类中有'django.middleware.csrf.CsrfViewMiddleware',在我的post表单中也有令牌 这是我的密码,我做错了什么 from django.contrib.auth.forms import UserCreationForm from django.shortcuts import render_to_response from django.http import HttpResponse

作为Django的初学者,我已经尝试解决这个问题很久了。 在我的中间件类中有'django.middleware.csrf.CsrfViewMiddleware',在我的post表单中也有令牌

这是我的密码,我做错了什么

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 %}
{%block content%}
登记
{%csrf_令牌%}
{{form.as_p}}
{%endblock%}
Update:这个答案来自2011年。CSRF现在很容易。 现在,您应该使用
render
快捷功能
return render(request,'template.html')
,它会自动使用
RequestContext
,因此下面的建议过期8年

  • 使用
    渲染
  • 添加CSRF中间件
  • 使用
    {%csrf\u令牌%}
    模板标记
  • 确认您看到正在生成并在表单请求中提交的CSRF令牌值
  • 原始响应 我的猜测是,您在模板中有标记,但它没有呈现任何内容(或者您的意思是您在实际的HTML中确认正在生成CSRF令牌?)

    使用
    RequestContext
    而不是字典

    render_to_response("foo.html", RequestContext(request, {}))
    
    或者确保您的
    context\u处理器设置中有
    django.core.context\u processors.csrf


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

    return render\u to\u response(“register.html”,{'form':form,},context\u instance=RequestContext(request))


    它会起作用的

    如果未使用CsrfViewMiddleware,则必须对使用csrf_令牌模板标记的任何视图以及接受POST数据的视图使用csrf_保护。

    添加
    RequestContext
    是使用
    呈现到_响应时的关键,正如@Yuji'Tomita'Tomita和@Njogu Mbau所述。然而,当我遇到这个问题时,最初让我感到不快的是,我必须将
    RequestContext
    添加到
    views.py
    中最初加载模板的函数和
    views.py
    中处理模板提交的函数中

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


    尝试使用渲染而不是渲染到响应

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


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

    在我安装Django livereload服务器后,在某些页面上随机出现此错误。卸载django livereload服务器就成功了。

    对我有用的是从我的
    设置.py中注释掉下面的一行


    对于django版本3.0,添加以下注释

    @csrf\u保护
    def yourfunc(请求):
    返回呈现(请求“../your.html”,无)
    
    别忘了在你的字段中添加下面的标签

    
    {%csrf_令牌%}
    ...
    
    我也遇到了这个问题,但老实说,几分钟后我在浏览器上点击了“刷新”按钮,没有做任何更改,当时它正常工作。我在命令行中显示了此消息,以便提供导致问题的线索:

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

    成功了!我仍然有点难以完全理解它,但至少我已经不再茫然地盯着它,试图随意改变它。医生没有帮我太多,非常感谢!这是文档中的第3步:)如果你能让自己深入一点,Django的文档会非常棒。祝你好运非常感谢,这解决了我的问题。对每个人的一般建议:检查用户是否使用正确的参数呈现_to_response(),我弄糟了,给了它3个参数,因此导致了上述错误。可能的重复只是完全删除了CSRF保护;它没有解决实际问题。