Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.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 未设置Django CSRF Cookie_Python_Django - Fatal编程技术网

Python 未设置Django CSRF Cookie

Python 未设置Django CSRF Cookie,python,django,Python,Django,我现在有一些问题,我遇到CSRF Cookie未设置。请看下面的代码 python def存款(请求、账号): 如果request.method==“POST”: 帐户=获取对象或404(帐户信息,帐户编号=帐户编号) 表单=账户表单(request.POST或None,实例=账户) 表单=余额表单(请求.发布) info=str(账户信息对象过滤器(账户编号=账户编号)) inf=info.split() 如果form.is_有效(): #cd=表格.U数据 now=datetime.date

我现在有一些问题,我遇到CSRF Cookie未设置。请看下面的代码

python
def存款(请求、账号):
如果request.method==“POST”:
帐户=获取对象或404(帐户信息,帐户编号=帐户编号)
表单=账户表单(request.POST或None,实例=账户)
表单=余额表单(请求.发布)
info=str(账户信息对象过滤器(账户编号=账户编号))
inf=info.split()
如果form.is_有效():
#cd=表格.U数据
now=datetime.datetime.now()
cmodel=form.save()
cmodel.acct\u number=账户数量
#代表(C型号账户编号)
cmodel.bal_change=“%0.2f”%float(cmodel.bal_change)
cmodel.total_balance=“%0.2f”%(浮动(inf[1])+浮动(cmodel.bal_change))
account.balance=“%0.2f”%float(cmodel.total_balance)
cmodel.total_balance=“%0.2f”%float(cmodel.total_balance)
#cmodel.bal_change=cmodel.bal_change
cmodel.issued=now.strftime(“%m/%d/%y%I:%m:%S%p”)
account.recent_change=cmodel.issued
cmodel.save()
account.save()
返回HttpResponseRedirect(“/history/”+account_num+“/”)
其他:
返回render\u to\u响应('history.html',
{'account_form':form},
上下文\实例=请求上下文(请求))
在HTML中,这里是代码

HTML

{{account_form.bal_change}}
{%csrf_令牌%}

我卡住了,我已经清除了cookie,使用了其他浏览器,但仍然没有设置csrf cookie。

尝试检查您的浏览器是否已安装在settings.py中

 MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',)
在模板中,使用csrf_标记格式化数据:

<form>{% csrf_token %}
</form>
{%csrf\u令牌%}

在您看来,您是否正在使用csrf装饰器

从django.views.decorators.csrf导入csrf\u protect

@csrf\u保护
def视图(请求、参数):

..

问题似乎是您没有适当地处理
GET
请求,或者在未先获取表单的情况下直接发布数据

当您第一次访问页面时,客户端将发送
GET
请求,在这种情况下,您应该发送带有适当表单的html

稍后,用户填写表单并发送带有表单数据的
POST
请求

你的观点应该是:

def deposit(request,account_num):
   if request.method == 'POST':
      form_=AccountForm(request.POST or None, instance=account)
      if form.is_valid(): 
          #handle form data
          return HttpResponseRedirect("/history/" + account_num + "/")
      else:
         #handle when form not valid
    else:
       #handle when request is GET (or not POST)
       form_=AccountForm(instance=account)

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

如果设置了
CSRF\u COOKIE\u SECURE=True
,并且您正在不安全地访问站点,或者按照说明设置了
CSRF\u COOKIE\u HTTPONLY=True
,并且检查chrome的COOKIE是否设置了网站的默认选项,则也会发生这种情况。允许设置本地数据(推荐)。

方法1:

from django.shortcuts import render_to_response
return render_to_response(
    'history.html',
    RequestContext(request, {
        'account_form': form,
    })
方法2:

from django.shortcuts import render
return render(request, 'history.html', {
    'account_form': form,
})

因为render_to_response方法可能会出现一些响应cookie问题

由于Python本身的一个bug,这个问题最近再次出现

受影响的版本包括2.7.8和2.7.9。 如果其中一个值包含
[
字符,则无法正确读取cookie


更新Python(2.7.10)解决了这个问题。

我刚刚见过一次,解决方案是清空cookies。
在调试相关的
SECRET\u KEY
时可能会更改。清除浏览器的缓存为我解决了这个问题。在完成另一个项目后,我一直在切换本地开发环境来完成django博客Zinia教程。起初,我想改变安装的应用程序的顺序以匹配tut这是由orial造成的,但我将其设置回原位,直到清除缓存后才能更正。

From 您可以通过向视图中添加

from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
 #...

如果此方法不起作用。您将尝试在中间件中注释csrf。然后再次测试。

我以前使用过Django 1.10。因此,我面临着这个问题。
from django.http import HttpResponse
from django.views.decorators.csrf import csrf_exempt

@csrf_exempt 
def your_view(request):
    if request.method == "POST":
        # do something
    return HttpResponse("Your response")

现在我将其降级为Django 1.9,它工作正常。

请确保在settings.py中正确配置了Django会话后端。然后重试此操作

class CustomMiddleware(object):
  def process_request(self,request:HttpRequest):
      get_token(request)
根据django版本,在
middleware\u CLASSES
middleware
下的
settings.py
中添加此中间件

get_token-返回POST表单所需的CSRF token。该token是字母数字值。如果尚未设置新的token,则会创建一个新的token。

如果您使用以登录用户身份发出POST请求并禁止获取
(未设置CSRF cookie)
,这可能是因为默认情况下,
fetch
不包含会话cookie,这会导致Django认为您与加载页面的用户不同

您可以通过传递选项
credentials:'include'
来获取以下内容,从而包括会话令牌:

var csrftoken = getCookie('csrftoken');
var headers = new Headers();
headers.append('X-CSRFToken', csrftoken);
fetch('/api/upload', {
    method: 'POST',
    body: payload,
    headers: headers,
    credentials: 'include'
})

在使用DRF时,我遇到了类似的情况,解决方案是将.as_view()方法附加到URL.py中的视图中,我遇到了相同的错误,在我的示例中,添加方法\u decorator有助于:

from django.views.decorators.csrf import csrf_protect
from django.utils.decorators import method_decorator

method_decorator(csrf_protect)
def post(self, request):
    ...

如果不设置表单操作,也会发生这种情况。
对我来说,当代码为:

<form class="navbar-form form-inline my-2 my-lg-0" role="search" method="post">

当我将代码更正为以下内容时:

<form class="navbar-form form-inline my-2 my-lg-0" action="{% url 'someurl' %}" role="search" method="post">


我的错误消失了。

如果您正在使用DRF,请检查您的URL模式是否正确,可能您忘记了
。as\u view()

所以我的代码是这样的:

urlpatterns += path('resource', ResourceView) 
它应该是这样的:

urlpatterns += path('resource', ResourceView.as_view())

您的
MIDDLEWARE\u类
设置中是否有
CsrfViewMiddleware
?添加
{%csrf\u令牌%}
在模板中的表单中。@Rohan它已经在那里了,请看问题。是的,我已经有了CsrfViewMiddleware,并且我的表单中已经有了csrf_令牌。我一直在使用Django cors模块并通过ReactJS访问它。(两者都在本地主机上)。我也有这个操作问题