CSRF验证失败:源检查失败 - http://localhost:8000/与任何受信任的来源都不匹配。

11
请帮我解决这个问题。 我正在构建一个由Django Rest Framework和ReactJS组成的应用程序,我使用了ViewSets。
我的错误: Screenshot of the error

Demo

响应数据:

{"detail":"CSRF Failed: Origin checking failed - http://localhost:8000/ does not match any trusted origins."}

ReactApp中的DeleteLead函数
 export const deleteLead = (id) => (dispatch) => {
  axios
    .delete(`/api/leads/${id}/`)
    .then((res) =>
      dispatch({
        type: DELETE_LEAD,
        payload: id,
      })
    )
    .catch((err) => {
      console.log(err);
    });
};

LeadViewSet: 从rest_framework导入viewsets、permissions 从.serializsers导入LeadSerializers 从leads.models导入Lead

# lead viewset
class LeadViewSet(viewsets.ModelViewSet):
    queryset = Lead.objects.all()
    # permission - bu ruxsat beruvchi
    permission_classes = [
        permissions.AllowAny # barcha uchun ruxsat
    ]
    serializer_class = LeadSerializers

LeadSerzializers:

# lead serializer
class LeadSerializers(serializers.ModelSerializer):
    class Meta:
        model=Lead
        fields="__all__"

主模型:

class Lead(models.Model):
    name = models.CharField(max_length=50)
    email = models.EmailField(max_length=100, unique=True)
    message = models.TextField(max_length=500, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name
4个回答

16

尝试在设置文件中设置 CSRF 受信任的来源、允许的主机等,格式如下:

CSRF_TRUSTED_ORIGINS = [
    'http://localhost:8000'
],
ALLOWED_HOSTS = [
    'localhost',
],
CORS_ORIGIN_WHITELIST = [
    'http://localhost:8000',
]

非常感谢你!!!!!!!! - F_C_T_L

0
我在使用Postman进行API测试时也遇到了同样的问题,通过清除Postman工具中的cookies,我解决了这个问题。

0
对于所有在本地进行操作的人来说,这可能是因为您已登录到Django管理面板。退出登录可以解决这个错误。
所有CSRF解决方案都是正确的做法。然而,如果您正在构建一个本地项目,这个解决方案可能有效。
这是因为Django在存在用户会话时期望有一个CSRF令牌,而且由于Django默认使用的是cookie会话,这些会话容易受到跨站请求伪造(CSRF)的攻击。当然,如果没有用户登录,就没有必要使用CSRF,因为没有需要保护的cookie,所以请求将在没有令牌的情况下正常工作。

0

Jaime所写的基础上,我有以下内容:

python manage.py shell <<EOF
from django.conf import settings
from urllib.parse import urlparse

print([urlparse(origin).netloc.lstrip("*") for origin in settings.CSRF_TRUSTED_ORIGINS])
print({origin for origin in settings.CSRF_TRUSTED_ORIGINS if "*" not in origin})
EOF

运行上述代码将显示CSRF_TRUSTED_ORIGINS的设置详情。

我曾经遇到这样一种情况,我是正确的,但是在设置文件下面的某个地方,这个相同的设置已经引用了localhost:7007,并且它已经被部署了。

上述内容帮助我检测和修复了问题。如果您的应用程序在docker容器中,请按以下方式启动:

docker exec -i add-container-name-here python manage.py shell

其余部分与上面所示的相同。

部署错误页面的示例


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接