浏览器向 django 发出 OPTIONS 请求以进行 CORS 请求,但没有 POST



我正在尝试通过帖子将一个表单从反应应用程序提交到不同来源的 django 服务器。

浏览器发送一个 OPTIONS 请求,服务器上的 cors 中间件以 200 响应该请求,以及以下信息:

HTTP/1.1 200 OK
Date: Mon, 08 Apr 2019 16:34:38 GMT
Server: WSGIServer/0.2 CPython/3.7.2
Content-Type: text/html; charset=utf-8
Content-Length: 0
Vary: Origin
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: accept, accept-encoding, authorization, content-type, dnt, origin, user-agent, x-csrftoken, x-requested-with
Access-Control-Allow-Methods: DELETE, GET, OPTIONS, PATCH, POST, PUT
Access-Control-Max-Age: 86400
Connection: keep-alive

但浏览器随后从未发出 POST 请求。它在控制台中不显示任何错误...

尝试安装django-cors-headers(https://pypi.org/project/django-cors-headers/(应用程序,只需将CORS_ORIGIN_ALLOW_ALL = True添加到您的 django 设置文件中。这是解决问题的最简单方法,此应用程序为您提供了许多CORS自定义选项。

或者,您可以编写自定义中间件并为每个响应添加 CORS 标头。

否则,您可以将CORS标头配置添加到Web服务器(nginx,apache等(。

转到检查元素的请求响应,并检查那里是否有任何"不允许标头"消息。

如果是这样,请将该标头添加到 django 中的 CORS_ALLOW_HEADER = ['that-header'] settings.py

就我而言,不允许缓存控制标头。所以我添加了它,它奏效了。

事实证明,

您必须将Cache-Control添加到CORS_ALLOW_HEADERS才能使其正常工作。某些浏览器无法将其设置为"*"。这是我的设置:

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_METHODS = [
    "DELETE",
    "GET",
    "OPTIONS",
    "PATCH",
    "POST",
    "PUT",
]
CORS_ALLOW_HEADERS = [
    "accept",
    "accept-encoding",
    "authorization",
    "content-type",
    "dnt",
    "origin",
    "user-agent",
    "x-csrftoken",
    "x-requested-with",
    "cache-control",
    "pragma",
]

最新更新