首页 文章

Django MongoEngine CORS错误

提问于
浏览
2

我正在使用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 回答

  • 0

    这可能对你有帮助 . 我使用这个配置为我的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';
        }
    
    })();
    
  • 0

    我想通了 .

    1)在客户端, Headers 应该只包含可以生成代码的自定义 Headers :

    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应用程序时使用CORS设置)

    INSTALLED_APPS = [....
    'corsheaders',
    ...
    ]
    MIDDLEWARE = [
    'corsheaders.middleware.CorsMiddleware',
    ...
    ]
    

    (对于访问您的django应用程序的网址)

    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']
    

    4)使用connector.Server的load_server_list()函数不是必需的

    这些 Headers 可以在项目级别访问,因此每个视图函数都不需要显式返回OPTIONS请求的响应 . django-cors-headers为你照顾它 . 有关更明确的配置设置,请查看:https://github.com/ottoyiu/django-cors-headers

相关问题