Django CSRF Coo​​kie未设置

73 python django

我现在有一些问题,我遇到CSRF Coo​​kie没有设置.请看下面的代码

蟒蛇

def deposit(request,account_num):
if request.method == 'POST':
    account = get_object_or_404(account_info,acct_number=account_num)
    form_=AccountForm(request.POST or None, instance=account)
    form = BalanceForm(request.POST)
    info = str(account_info.objects.filter(acct_number=account_num))
    inf=info.split()
    if form.is_valid():
    #cd=form.cleaned_data
        now = datetime.datetime.now()
        cmodel = form.save()
        cmodel.acct_number=account_num
        #RepresentsInt(cmodel.acct_number)
        cmodel.bal_change="%0.2f" % float(cmodel.bal_change)
        cmodel.total_balance="%0.2f" %(float(inf[1]) + float(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()
        return HttpResponseRedirect("/history/" + account_num + "/")
    else:
        return render_to_response('history.html',
                          {'account_form': form},
                          context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

在HTML中这里是代码

HTML

<form action="/deposit/{{ account_num }}/" method="post">

<table>
<tr>
{{ account_form.bal_change }}
&nbsp;
<input type="submit" value="Deposit" />
</tr>
{% csrf_token %}
</table>
</form>
Run Code Online (Sandbox Code Playgroud)

我卡住了,我已经清除了cookie,使用了其他浏览器,但仍未设置csrf cookie.

Dru*_*ska 111

如果CSRF_COOKIE_SECURE = True已设置并且您正在非安全地访问该站点,也会发生这种情况.

  • 谢谢!"SESSION_COOKIE_SECURE = True"也是如此. (9认同)

Евг*_*нов 57

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")
Run Code Online (Sandbox Code Playgroud)

  • 完全禁用安全机制不是修复错误的好方法. (33认同)
  • 这个答案并不建议“完全禁用安全机制”,它只是告诉您如何在您可能无法使用 CSRF 令牌的单一情况下执行此操作。这是我的情况,我需要向外部客户端提供 POST 操作。 (6认同)
  • 如果您在 2017 年使用 cookiecutter-django,这是生产中的正确答案。 (2认同)

use*_*461 19

如果您使用HTML5 Fetch API以登录用户身份发出POST请求并获取Forbidden (CSRF cookie not set.),可能是因为默认情况下fetch不包含会话cookie,导致Django认为您与加载页面的用户不同.

您可以通过将选项传递credentials: 'include'给fetch 来包含会话令牌:

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

  • 就我而言,这就是问题所在.Upvoted. (2认同)

小智 7

来自 您可以通过将ensure_csrf_cookie装饰器添加到视图中来解决问题

from django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def yourView(request):
 #...
Run Code Online (Sandbox Code Playgroud)

如果这种方法不起作用.你会尝试在中间件中评论csrf.并再次测试.


Alv*_*ona 7

如果您使用的是 DRF,请检查您的 urlpatterns 是否正确,也许您忘记了.as_view()

所以我的代码看起来像:

urlpatterns += path('resource', ResourceView) 
Run Code Online (Sandbox Code Playgroud)

它应该是这样的:

urlpatterns += path('resource', ResourceView.as_view())
Run Code Online (Sandbox Code Playgroud)


Pra*_*tre 5

我在使用 DRF 时遇到了类似的情况,解决方案是将 .as_view() 方法附加到 urls.py 中的视图

  • @AlexJolig刚刚面临同样的问题,问题是我忘记在 ApiView 之后添加 `.as_view()` 这样代码看起来像: `urlpatterns += path('resource', ResourceView)` 这就是它应该的样子比如:`urlpatterns += path('resource', ResourceView.as_view())` (2认同)