`/` 上的表单中的 CSRF 令牌丢失或不正确

Posted

技术标签:

【中文标题】`/` 上的表单中的 CSRF 令牌丢失或不正确【英文标题】:CSRF token missing or incorrect from form on `/` 【发布时间】:2018-06-20 07:11:46 【问题描述】:

我有这个在urls.py:

url("^$", direct_to_template, "template": "index.html", name="home"),
url("^searched-location", views.searched_location, name="searched_location"),

我有这个在index.html:

% extends "base.html" %
% load pages_tags mezzanine_tags i18n staticfiles %

% block main %
<form id="my-form class="input-group">
    % csrf_token %
    <input type="text" class="form-control">
    <script src="% static "script/script.js" %"></script>
</form>
% endblock %

script.js 有这一行:

document.getElementById("my-form").addEventListener("submit",function(event)
  event.preventDefault();
,false);

function when_User_Types_Something_Send_That_Stuff_To_The_Backend(typedStuff)
    // some code
    $.post("/searched-location",typed_stuff: stuff_the_user_typed);

views.py 有这个:

def searched_location(request):
    print request
    # More code here

问题是当我在本地运行python manage.py runserver 时,我的终端出现此错误:

Forbidden (CSRF token missing or incorrect.): /searched-location
[11/Jan/2018 01:57:06] "POST /searched-location HTTP/1.1" 403 2502

为什么 CSRF 令牌丢失或不正确?如何找到或更正它?

【问题讨论】:

$.post("/searched-location",typed_stuff: stuff_the_user_typed); 不包含 csrf 令牌。 我没有看到您的表单和发布到搜索位置的代码之间的联系。 文档展示了如何使用 jQuery 来实现这一点:docs.djangoproject.com/en/2.0/ref/csrf 【参考方案1】:

您没有在 POST 请求中包含 CSRF 令牌。

将您的代码更改为:

$.post("/searched-location",typed_stuff: stuff_the_user_typed, csrfmiddlewaretoken: $("input[name=csrfmiddlewaretoken]").val());

将其包含在您的请求中。

【讨论】:

以上是关于`/` 上的表单中的 CSRF 令牌丢失或不正确的主要内容,如果未能解决你的问题,请参考以下文章

注册表单不起作用(CSRF 令牌丢失或不正确。) django

禁止(CSRF 令牌丢失或不正确。)Django

Django - 在同一个模板(ajax 和表单)中处理多个 CSRF 令牌禁止(CSRF 令牌丢失或不正确。)

CSRF 令牌丢失或不正确

Django - CSRF 令牌丢失或不正确

CSRF 令牌丢失或不正确。 Django + AngularJS