Javascript Django MongoEngine CORS错误
我正在使用django 1.11.7,并且安装了django cors侦听器。我一直在尝试将POST请求中的自定义头发送到我的DRF应用程序,但出现以下错误: 对飞行前请求的响应未通过访问控制检查:否 “Access Control Allow Origin”标头出现在请求的服务器上 资源。因此,不允许使用源“” 通道响应的HTTP状态代码为400 localhost:3000是调用应用程序的宿主。 javascript POST请求具有以下标题:Javascript Django MongoEngine CORS错误,javascript,python,mongodb,django-rest-framework,cors,Javascript,Python,Mongodb,Django Rest Framework,Cors,我正在使用django 1.11.7,并且安装了django cors侦听器。我一直在尝试将POST请求中的自定义头发送到我的DRF应用程序,但出现以下错误: 对飞行前请求的响应未通过访问控制检查:否 “Access Control Allow Origin”标头出现在请求的服务器上 资源。因此,不允许使用源“” 通道响应的HTTP状态代码为400 localhost:3000是调用应用程序的宿主。 javascript POST请求具有以下标题: headers.append('Access-
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) 修改了my 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',
)
现在我得到了这个错误:
不允许请求标头字段访问控制允许来源
访问控制允许飞行前响应中的标头
5) 服务器配置(在settings.py自身中)
这还会引发一个错误,说明“没有名为connector的模块”。我做了更多关于“连接器”的研究,显然这是针对MySQL类型的数据库,但我正在使用mongodb(mongoengine与django一起工作)
我做错了什么?这可能会帮助你。我在djangularjs应用程序中使用了此配置
(function() {
'use strict';
angular
.module('app_name.config')
.config(config);
config.$inject = ['$locationProvider', '$httpProvider'];
/**
* @name config
* @desc Enable HTML5 routing
*/
function config($locationProvider, $httpProvider) {
$locationProvider.html5Mode(true);
$locationProvider.hashPrefix('');
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
}
})();
我明白了
1) 在客户端,头应该只包括自定义头,这将使代码:
headers.append('Content-Type', 'application/json');
headers.append('header-one', "value@123");
2) 在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)
3) 在settings.py中添加以下行:
'django.middleware.clickjacking.XFrameOptionsMiddleware'
(运行django应用程序时使用CORS设置)
(用于访问django应用程序的URL)
或
(用于来自客户端的请求对象头)
(用于发送到客户端的响应对象头)
4) 使用连接器加载_server_list()函数。不需要服务器
这些标题可以在项目级别访问,因此每个视图函数都不需要显式返回对选项请求的响应。django cors headers会帮你处理。有关更明确的配置设置,请查看:我觉得客户端配置似乎不错,但可能缺少一些django enable CORS配置-@Keshanageswaran我按照链接添加了load_server_list()方法,但它给了我一个错误:没有模块名称“connector”。还有什么要安装的吗?
INSTALLED_APPS = [....
'corsheaders',
...
]
MIDDLEWARE = [
'corsheaders.middleware.CorsMiddleware',
...
]
CORS_ORIGIN_ALLOW_ALL = True
CORS_ORIGIN_ALLOW_ALL = False
CORS_ORIGIN_WHITELIST = ('tuple of urls allowed to access your app')
from corsheaders.defaults import default_headers
CORS_ALLOW_HEADERS = default_headers + (
'header-one',
)
CORS_EXPOSE_HEADERS = ['list of headers to send']