浏览器向django发出选项请求,请求CORS,但没有POST

浏览器向django发出选项请求,请求CORS,但没有POST,django,cors,django-cors-headers,Django,Cors,Django Cors Headers,我正试图通过post将react应用程序中的表单提交到不同来源的django服务器 浏览器发送一个选项请求,服务器上的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

我正试图通过post将react应用程序中的表单提交到不同来源的django服务器

浏览器发送一个选项请求,服务器上的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
()应用程序,只需将
cors\u ORIGIN\u ALLOW\u ALL=True
添加到django设置文件中即可。这是解决您问题的最简单方法,该应用程序为您提供了许多CORS定制选项

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


否则,您可以向web服务器(nginx、apache等)添加CORS headers配置。

转到inspect元素以获取请求响应,并检查是否有任何“headers is not allowed”消息

如果是,则将该头添加到django settings.py中的CORS_ALLOW_头=['that-header']


在我的例子中,缓存控制头是不允许的。所以我添加了它,它成功了。

我已经这样做了,这就是对初始选项请求的响应。您是否为CORS使用任何浏览器扩展?如果是这样的话,禁用它们。不,不是那样的。不过,我认为问题出在克莱特这边。您可以使用Postman或CURL-and-watch响应头发送请求。因此,这是一个有效的飞行前响应,并且飞行前没有失败(如果失败,浏览器将记录一个特定的错误),因此,没有任何东西会阻止浏览器从您的代码发出POST请求。所以我不知道为什么浏览器不这么做。您是否在其他浏览器中尝试过,在其他浏览器中是否看到相同的行为?您是否尝试过更改请求的特征(例如,请求头)以使其不会触发预飞行,在这种情况下,POST是否按预期进行?您如何得出浏览器没有发出POST请求的结论?如果在devtools中打开网络窗格并重新加载,POST请求是否会在选项请求之后显示?@sideshowbarker,django开发服务器会列出它收到的所有请求。它接收选项,但没有后续的POST。如果我将模式切换为“无cors”,服务器确实会收到POST请求。好的,我知道这是您从服务器端看到的。但是,在浏览器devtools的“网络”选项卡中,您在客户端看到了什么?可以想象,浏览器实际上是在发出POST请求,但它随后会被取消,例如。还有,就像我说的,你有没有在其他浏览器上试用过它,你在那里看到过同样的行为吗?@sideshowbarker对延迟表示抱歉。现在出现一个错误:
对飞行前请求的响应未通过访问控制检查:请求的资源上不存在“访问控制允许原点”标题。
。根据开发工具,没有提出POST请求。。。不同的浏览器做同样的事情