如何在Django REST Framework上启用CORS


Answers:


146

您在问题中引用的链接建议使用django-cors-headers,其文档指出要安装该库

pip install django-cors-headers

然后将其添加到已安装的应用程序中:

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

您还需要添加一个中间件类来侦听响应:

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
)

请浏览其文档的配置部分,并特别注意各种CORS_ORIGIN_设置。您需要根据需要设置其中一些。


2
您是否知道其他方法,而无需安装新的依赖项?我现在正在尝试创建中间件类
Julio Marins

5
@JulioMarins,为什么要编写自己的版本,因为它易于使用且易于安装,并具有12个发行版,21个贡献者,超过800个星标和超过100个fork?
克里斯

2
您确实有一点Access-Control-Allow-Origin: *要说,但是由于简单的CORS唯一需要的是标头,所以我看不到为什么加载整个内容,因此我将在您的答案中加入另一种方法来做到这一点,以便两种方法都可用。参考:[链接(] enable-cors.org/server.html
胡Marins

2
@JulioMarins,那将是大锤方法。如果您查看我提供的配置链接,将会发现它django-cors-headers比这灵活得多。如果您想创建自己的课程,请成为我的客人。但是我会使用那个库。
克里斯(Chris

4
@Chris我认为您应该添加CORS_ORIGIN_WHITELIST,以便将呼叫主机列入白名单。
哈基姆

58
pip install django-cors-headers

然后将其添加到已安装的应用程序中:

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)

您还需要添加一个中间件类来侦听响应:

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',  
    'django.middleware.common.CommonMiddleware',  
    ...
)

CORS_ORIGIN_ALLOW_ALL = True # If this is used then `CORS_ORIGIN_WHITELIST` will not have any effect
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = [
    'http://localhost:3030',
] # If this is used, then not need to use `CORS_ORIGIN_ALLOW_ALL = True`
CORS_ORIGIN_REGEX_WHITELIST = [
    'http://localhost:3030',
]

更多详细信息:https : //github.com/ottoyiu/django-cors-headers/#configuration

阅读官方文档可以解决几乎所有问题


4
必须将添加到@Chris答案中的四行添加到我的计算机中。
马特D

5
为什么是CORS_ORIGIN_ALLOW_ALL = True,但CORS_ORIGIN_WHITELIST仍然设置?文档似乎使这看起来不是必需的,并且似乎使这里的答案感到困惑。
凤凰城

CORS_ORIGIN_ALLOW_ALL如果为True,将不使用白名单,并且将接受所有来源。
BjornW

2
另外请记住,'corsheaders.middleware.CorsMiddleware',需要放在列表的顶部,否则连接可能会被拒绝。
塞巴斯蒂安·范斯汀斯基斯特

14

即使知道最佳选择是使用经过测试的包方法,您也可以使用自定义中间件来进行操作django-cors-headers。这样说,这里是解决方案:

创建以下结构和文件:

- myapp/middleware/__init__.py

from corsMiddleware import corsMiddleware

- myapp/middleware/corsMiddleware.py

class corsMiddleware(object):
    def process_response(self, req, resp):
        resp["Access-Control-Allow-Origin"] = "*"
        return resp

添加到settings.py标记的行:

MIDDLEWARE_CLASSES = (
    "django.contrib.sessions.middleware.SessionMiddleware",
    "django.middleware.common.CommonMiddleware",
    "django.middleware.csrf.CsrfViewMiddleware",

    # Now we add here our custom middleware
     'app_name.middleware.corsMiddleware' <---- this line
)

谢谢朱利奥!您的中间件代码应使用@masnun代码示例进行更新。另外,从导入对我不起作用。解决了该问题: from . import corsMiddleware
Pavel Daynyak

12

万一有人回到这个问题并决定编写自己的中间件,这是Django新型中间件的代码示例-

class CORSMiddleware(object):
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        response["Access-Control-Allow-Origin"] = "*"

        return response

7

根据文档,对于Django版本> 1.10,可以将自定义MIDDLEWARE编写为函数,例如在文件中:(yourproject/middleware.py作为的同级settings.py):

def open_access_middleware(get_response):
    def middleware(request):
        response = get_response(request)
        response["Access-Control-Allow-Origin"] = "*"
        response["Access-Control-Allow-Headers"] = "*"
        return response
    return middleware

最后,将此函数的python路径(写入项目的根目录)添加到项目的MIDDLEWARE列表中settings.py

MIDDLEWARE = [
  .
  .
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
  'yourproject.middleware.open_access_middleware'
]

十分简单!


之前发布的方法使用MIDDLEWARE_CLASSES而不是MIDDLEWARE。这项技术有效,因此人们无需呼吁下注:) @JulioMarins
Dhruv Batheja 18/12/3

1
老兄,解决方案是一样的。您正在争论有关Django版本的实现。您的代码的缩进也错误open_access_middleware
朱利奥·马林斯

4

好吧,我不认识男人,但是:

在这里使用python 3.6和django 2.2

在settings.py中将MIDDLEWARE_CLASSES重命名为MIDDLEWARE起作用。


3

以下是不需要任何外部模块的工作步骤:

步骤1:在您的应用中创建一个模块。

例如,假设我们有一个名为user_registration_app的应用程序。探索user_registration_app并创建一个新文件。

让我们将其称为custom_cors_middleware.py

粘贴下面的类定义:

class CustomCorsMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response
        # One-time configuration and initialization.

    def __call__(self, request):
        # Code to be executed for each request before
        # the view (and later middleware) are called.

        response = self.get_response(request)
        response["Access-Control-Allow-Origin"] = "*"
        response["Access-Control-Allow-Headers"] = "*"

        # Code to be executed for each request/response after
        # the view is called.

        return response

步骤2:注册中间件

在您的项目settings.py文件中,添加以下行

'user_registration_app.custom_cors_middleware.CustomCorsMiddleware'

例如:

  MIDDLEWARE = [
        'user_registration_app.custom_cors_middleware.CustomCorsMiddleware', # ADD THIS LINE BEFORE CommonMiddleware
         ...
        'django.middleware.common.CommonMiddleware',

    ]

请记住,将user_registration_app替换为在其中创建了custom_cors_middleware.py模块的应用程序的名称。

现在,您可以验证它会将必需的响应标头添加到项目中的所有视图中!


0

Django = 2.2.12 django-cors-headers = 3.2.1 djangorestframework = 3.11.0

遵循官方指示无效

最后使用旧的方法来解决。

加:

# proj/middlewares.py
from rest_framework.authentication import SessionAuthentication


class CsrfExemptSessionAuthentication(SessionAuthentication):

    def enforce_csrf(self, request):
        return  # To not perform the csrf check previously happening
#proj/settings.py

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'proj.middlewares.CsrfExemptSessionAuthentication',
    ),
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.