我正在尝试通过帖子将一个表单从反应应用程序提交到不同来源的 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",
]