如何在Django REST Framework上启用CORS

时间:2016-03-03 00:32:00

标签: python django cors django-rest-framework middleware

如何在Django REST Framework上启用CORS? reference没什么用,它说我可以通过中间件来做,但我怎么能这样做呢?

9 个答案:

答案 0 :(得分:81)

您在问题中引用的链接建议使用django-cors-headers,其documentation表示安装库

pip install django-cors-headers

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

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

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

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

您可能还想浏览其the configuration section文档,特别注意各种CORS_ORIGIN_设置。

答案 1 :(得分:21)

pip install django-cors-headers

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

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

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

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

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = (
    'localhost:3030',
)
CORS_ORIGIN_REGEX_WHITELIST = (
    'localhost:3030',
)

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

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

答案 2 :(得分:12)

您可以使用自定义中间件,即使知道最佳选项是使用包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
)

答案 3 :(得分:6)

如果有人回到这个问题并决定编写他们自己的中间件,这是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

答案 4 :(得分:2)

嗯,我不认识,但是:

在这里使用python 3.6和django 2.2

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

答案 5 :(得分:1)

对于Django版本> 1.10,根据documentation,可以将自定义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路径(带有项目根目录)添加到项目settings.py的MIDDLEWARE列表中:

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

轻松自如!

答案 6 :(得分:0)

您可能还需要将 CorsModel 模型添加到数据库中。尝试刷新时出现异常。

python3 manage.py makemigrations corsheaders
python3 manage.py migrate

答案 7 :(得分:0)

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

步骤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模块的应用的名称。

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

答案 8 :(得分: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',
    ),
}