禁止(403)CSRF验证失败。请求已中止。失败原因:来源检查失败与任何受信任的来源都不匹配

2022-04-08 00:00:00 python python-3.x django csrf django-csrf

问题描述

帮助

失败原因:

Origin checking failed - https://praktikum6.jhoncena.repl.co does not match any trusted origins.
通常,如果存在真正的跨站点请求伪造,或者没有正确使用Django的CSRF机制,就会出现这种情况。对于发布表单,您需要确保:

Your browser is accepting cookies.
The view function passes a request to the template’s render method.
In the template, there is a {% csrf_token %} template tag inside each POST form that targets an internal URL.
If you are not using CsrfViewMiddleware, then you must use csrf_protect on any views that use the csrf_token template tag, as well as those that accept the POST data.
The form has a valid CSRF token. After logging in in another browser tab or hitting the back button after a login, you may need to reload the page with the form, because the token is rotated after a login.
您将看到该页面的帮助部分,因为您的Django设置文件中有DEBUG=True。将其更改为False,则只显示初始错误消息。

您可以使用CSRF_FAILURE_VIEW设置来自定义此页面。


解决方案

检查您是否正在使用Django 4.0。我使用的是3.2版本,在升级到4.0时使用了这一中断。

如果你使用的是4.0,这就是我的解决方案。将此行添加到settings.py。这在我使用3.2时不是必需的,现在没有它我无法发布包含CSRF的表单。

CSRF_TRUSTED_ORIGINS = ['https://*.mydomain.com','https://*.127.0.0.1']

查看此行是否有任何需要的更改,例如,如果您需要将https替换为http

根本原因是4.0中增加了源头检查。

https://docs.djangoproject.com/en/4.0/ref/settings/#csrf-trusted-origins

Django 4.0中的更改:

在旧版本中不执行源头检查。

相关文章