我正在使用django 1.11.7而且我安装了django-cors-hearders . 我一直在尝试将POST请求中的自定义标头发送到我的DRF应用程序,但是我收到以下错误:
对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头 . 因此不允许来源'http:// localhost:3000'访问 . 响应具有HTTP状态代码400
localhost:3000是托管调用应用程序的位置 . javascript POST请求具有以下标头:
headers.append('Access-Control-Allow-Origin','*');
headers.append("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS, POST, PUT");
headers.append("Access-Control-Allow-Headers","Origin, header-one, X-Requested-With, Content-Type, Accept, Authorization, If-Modified-Since, Cache-Control, Pragma");
headers.append('Content-Type', 'application/json');
headers.append('header-one', "value@123");
我尝试过以下方法:
1)修改了我的django应用程序视图功能
if str(request.method).lower() == 'options':
headers = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "POST",
"Access-Control-Allow-Headers": "HTTP_HEADER_ONE"
}
return Response({}, headers=headers, status=status.HTTP_200_OK)
2)在settings.py的MIDDLEWARE = [...]中注释掉这一行:
'django.middleware.clickjacking.XFrameOptionsMiddleware'
因为它显然与cors中间件有关 .
3)在settings.py中添加了以下代码
INSTALLED_APPS = [....
'corsheaders',
...
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...
]
4)CORS配置:
CORS_ORIGIN_ALLOW_ALL = True
from corsheaders.defaults import default_headers
CORS_ALLOW_HEADERS = default_headers + (
'header-one',
)
现在我收到这个错误:
请求标头字段Access-Control-Allow-Origin在预检响应中不允许使用Access-Control-Allow-Origin .
5)服务器配置(在settings.py本身)
from connector import Server
def load_server_list():
for s in SERVER_LIST: # from CUSTOM_SETTINGS_MAPPINGS # noqa
server = (len(s) > 2) and unicode(s[2]) or None
Server(host=unicode(s[0]), port=int(s[1]), server=server)
Server.freeze()
load_server_list()
这也会引发错误,说“没有名为connector的模块” . 我做了一些与'连接器'相关的研究,显然这是针对MySQL类型的数据库,但我使用mongodb(mongoengine与django一起工作) .
我究竟做错了什么?
2 回答
这可能对你有帮助 . 我使用这个配置为我的djangularjs应用程序
我想通了 .
1)在客户端, Headers 应该只包含可以生成代码的自定义 Headers :
2)不要在django应用程序视图中进行任何更改 . 因此,如果它存在,请从视图函数中删除以下行:
3)在settings.py中添加以下行:
(在运行django应用程序时使用CORS设置)
(对于访问您的django应用程序的网址)
要么
(对于来自客户端的请求对象标头)
(用于响应对象标头发送到客户端)
4)使用connector.Server的load_server_list()函数不是必需的
这些 Headers 可以在项目级别访问,因此每个视图函数都不需要显式返回OPTIONS请求的响应 . django-cors-headers为你照顾它 . 有关更明确的配置设置,请查看:https://github.com/ottoyiu/django-cors-headers