Python 未设置Django CSRF Cookie
我现在有一些问题,我遇到CSRF Cookie未设置。请看下面的代码 pythonPython 未设置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
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访问它。(两者都在本地主机上)。我也有这个操作问题