CORS 在 Django 中不起作用,但设置似乎正确

Cec*_*uez 11 python django http cors django-cors-headers

我正在尝试从不同子域上的 React Native Web 前端对 Django 进行 POST 调用。

我以为我已经正确配置了 CORS,但事实似乎并非如此。

这是我的 Django settings.py 的样子:

CORS_ALLOW_CREDENTIALS = True

CORS_ALLOW_HEADERS = ['*']

CORS_ALLOWED_ORIGINS = ['https://api.example.com', 'https://example.com', 'https://www.example.com' ]

CSRF_TRUSTED_ORIGINS = [
    'https://api.example.com', 'https://example.com', 'https://www.example.com'
]

ALLOWED_HOSTS = ["0.0.0.0", "api.example.com", "example.com"]

MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware',
]

INSTALLED_APPS = [
     ...
    'corsheaders',
     ...
]
Run Code Online (Sandbox Code Playgroud)

我到底做错了什么?我收到的错误是这样的:

Access to XMLHttpRequest at 'https://api.example.com/api/v1/pagescreate/' from origin 'https://example.com' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Run Code Online (Sandbox Code Playgroud)

这是我的 Django 视图:

class PageCreateView(generics.CreateAPIView):
    queryset = Page.objects.all()
    serializer_class = PageSerializer
Run Code Online (Sandbox Code Playgroud)

可能是什么原因造成的?我是否缺少 React 中的某些设置?我正在使用 axios 进行调用,唯一的标头是"Content-Type": "application/json"

编辑:这可能是由于我的服务器上的某些 nginx 规则造成的吗?或者也许是我的 Kubernetes 配置?我正在使用 Docker 设置容器,并且可以轻松链接 Dockerfile 或我的 Kubernetes 设置中的任何信息

VJ *_*gar 5

我认为,这可能是由于设置中中间件的顺序造成的。(虽然我也不是完全有信心)

您可以尝试以下中间件序列吗

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware",
    "django.contrib.sessions.middleware.SessionMiddleware",
    "corsheaders.middleware.CorsMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    "django.contrib.messages.middleware.MessageMiddleware",
    "django.middleware.clickjacking.XFrameOptionsMiddleware",
]
Run Code Online (Sandbox Code Playgroud)

然后删除

CORS_ALLOW_HEADERS = ['*']
Run Code Online (Sandbox Code Playgroud)

从设置。

让我知道这是否有效


Gre*_* II -1

您确定 CORS_ALLOW_HEADERS 允许您设置“*”吗?

基于这里,看起来它的设计目的是扩展而不是替换: https://github.com/adamchainz/django-cors-headers/blob/2d22268ff59aa0b79820ea5b8983efd1e514ec4c/README.rst#cors_allow_headers 这个测试也让我认为它需要扩展而不是替换 https://github.com/adamchainz/django-cors-headers/blob/5067faefeb22beffcf1b12dd7ad9d3fb6d4b26e4/src/corsheaders/checks.py#L20-L21

我建议尝试使用默认值或尝试从上面的链接扩展它

我相信这是特定于库的值,而不是浏览器或请求 CORS 值

编辑:添加了 github.com 的测试链接