Django 版本 = 2.2.2 使用 Google Chrome 时似乎会出现此问题。
我在所有表单标签中添加了 {% csrf_token %},如下所示:
{% extends 'base.html' %}
{% block content %}
<form method="post">
{% csrf_token %} #-------------> here it is
{% for field in login_form %}
<p>
{{field.label_tag}}
{{field}}
{% if field.help_text %}
{field.help_text}}
{% endif %}
</p>
{% endfor %}
{% for field in login_form %}
{% for error in field.errors %}
<p>{{error}}</p>
{% endfor %}
{% endfor %}
{% if login_form.non_field_errors %}
<p>{{login_form.non_field_errors}}</p>
{% endif %}
<input type="submit" value="Login">
</form>
{% endblock content %}
但是当我实际尝试使用该表单登录并单击提交按钮时,它应该将我重定向到主页。然而,它却给了我以下错误消息:
*禁止 (403) CSRF验证失败。请求被中止。 帮助 失败原因给出: CSRF 令牌缺失或不正确。
一般来说,当存在真正的跨站请求伪造时,或者当Django的CSRF机制没有被正确使用时,就会发生这种情况。对于 POST 表单,您需要确保: 您的浏览器正在接受 cookie。 视图函数将请求传递给模板的渲染方法。 在模板中,每个针对内部 URL 的 POST 表单内都有一个 {% csrf_token %} 模板标记。 如果您不使用 CsrfViewMiddleware,则必须在使用 csrf_token 模板标记的任何视图以及接受 POST 数据的视图上使用 csrf_protect。 该表单具有有效的 CSRF 令牌。登录另一个浏览器选项卡或登录后点击后退按钮后,您可能需要使用表单重新加载页面,因为登录后令牌会轮换。 您看到此页面的帮助部分是因为您的 Django 设置文件中有 DEBUG = True。将其更改为 False,则仅显示初始错误消息。 您可以使用 CSRF_FAILURE_VIEW 设置自定义此页面。*
这是您面临的错误:https://docs.djangoproject.com/en/3.1/ref/csrf/#rejected-requests
您可以使用
@csrf_exempt
装饰器来防止 csrf 错误,并且使用它您可以完全删除 {% csrf_token %}
。检查这个:https://docs.djangoproject.com/en/3.0/ref/csrf/#django.views.decorators.csrf.csrf_exempt
请确保这些行包含在您的设置文件中:
CSRF_TRUSTED_ORIGINS = [
'http://localhost:8000',
'0.0.0.0',
'http://*youripaddress*',
]
ALLOWED_HOSTS = [
'localhost',
'0.0.0.0',
http://*youripaddress*',
]
CORS_ORIGIN_WHITELIST = [
'http://localhost:8000',
'0.0.0.0',
http://*youripaddress*',
]
默认情况下,Django 在生成项目时包含 ALLOWED_HOST 选项,但需要手动添加信任列表和白名单选项。