如何在Django REST Framework上启用CORS

Jul*_*ins 69 python django middleware cors django-rest-framework

如何在我的Django REST框架上启用CORS?该参考文献没有多大帮助,它说我可以用中间件做,但我怎么能这样做?

Chr*_*ris 102

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

pip install django-cors-headers
Run Code Online (Sandbox Code Playgroud)

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

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)
Run Code Online (Sandbox Code Playgroud)

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

MIDDLEWARE_CLASSES = (
    ...
    'corsheaders.middleware.CorsMiddleware',
    'django.middleware.common.CommonMiddleware',
    ...
)
Run Code Online (Sandbox Code Playgroud)

您可能还想浏览其文档的配置部分,特别注意各种CORS_ORIGIN_设置.

  • @JulioMarins,为什么你会在12个版本,21个贡献者,800多颗星和100多个分支中随时可用并轻松安装自己的版本? (4认同)
  • @Chris我认为您应该添加[CORS_ORIGIN_WHITELIST](https://github.com/ottoyiu/django-cors-headers/#cors_origin_whitelist),以便将呼叫主机列入白名单。 (3认同)
  • 您是否知道其他方法,而无需安装新的依赖项?我正在尝试创建一个中间件类 (2认同)
  • 您确实有一点要说,但是由于只需要一个简单的CORS就是标头`Access-Control-Allow-Origin:*`我看不到为什么要加载整个内容,因此我将在您的产品中添加另一种方法回答,这样两种方法都可以使用。参考:[link(] http://enable-cors.org/server.html) (2认同)
  • @JulioMarins,这将是大锤的方法.如果你看一下我提供的配置链接,你会发现`django-cors-headers`比这更灵活.如果您想创建自己的课程,请成为我的客人.但我会使用那个库. (2认同)

lik*_*ppy 31

pip install django-cors-headers
Run Code Online (Sandbox Code Playgroud)

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

INSTALLED_APPS = (
    ...
    'corsheaders',
    ...
)
Run Code Online (Sandbox Code Playgroud)

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

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

CORS_ORIGIN_ALLOW_ALL = True
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_WHITELIST = [
    'http://localhost:3030',
]
CORS_ORIGIN_REGEX_WHITELIST = [
    'http://localhost:3030',
]
Run Code Online (Sandbox Code Playgroud)

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

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

  • 另请记住,“corsheaders.middleware.CorsMiddleware”需要位于列表的顶部,否则连接可能会在到达之前被拒绝。 (6认同)
  • 添加你添加到@Chris的答案的四行是必要的,这对我有用. (4认同)
  • 为什么“ CORS_ORIGIN_ALLOW_ALL = True”,但仍设置“ CORS_ORIGIN_WHITELIST”?[文档](https://github.com/ottoyiu/django-cors-headers/#cors_origin_allow_all)似乎使这看起来不是必需的,并且似乎使这里的答案感到困惑。 (3认同)

Sub*_*lik 14

对于所有拥有最新版本 Django v3.xx 的人来说,已于2021 年更新,下面给出了允许来自任何来源的 CORS 的步骤。

第1步:安装所需的库

pip install django-cors-headers
Run Code Online (Sandbox Code Playgroud)

第 2 步:然后在INSTALLED_APPS中的适当位置添加settings.py- 在rest_framework应用程序之后和之前myapp

'rest_framework',
'corsheaders',
'myapp.apps.MyAppConfig',
Run Code Online (Sandbox Code Playgroud)

第 3 步:允许 api 的来源(在 内部settings.py

CORS_ORIGIN_WHITELIST = (
'http://localhost:3000',  # for localhost (REACT Default)
'http://192.168.10.45:3000', # for network
)
Run Code Online (Sandbox Code Playgroud)


Jul*_*ins 12

您可以使用自定义中间件,即使知道最佳选项是使用包的测试方法django-cors-headers.话虽如此,这是解决方案:

创建以下结构和文件:

- myapp/middleware/__init__.py

from corsMiddleware import corsMiddleware
Run Code Online (Sandbox Code Playgroud)

- myapp/middleware/corsMiddleware.py

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

添加到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
)
Run Code Online (Sandbox Code Playgroud)


Jul*_*s-Z 12

更新了 2022 年并添加了新的用例

当您使用带有选项的 Axios POST 时withCredentials: true,需要考虑一些其他选项。

我使用这个特定案例通过基本或/和会话登录进行身份验证。

避免出现错误消息:

对预检请求的响应未通过访问控制检查:响应中“Access-Control-Allow-Credentials”标头的值为“”,当请求的凭据模式为“include”时,该值必须为“true”。XMLHttpRequest 发起的请求的凭据模式由 withCredentials 属性控制。

还有上面别人提到的。我用这种方式解决了这个问题。

[IP地址来自我本地的示例,请记住更改它]

设置.py

INSTALLED_APPS = [
    ...
    'rest_framework',
    'corsheaders',
    'rest_framework.authtoken',
    ...
]

ALLOWED_HOSTS = ["localhost","192.168.0.50"]

CORS_ALLOW_CREDENTIALS = True

CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000',  # for localhost (REACT Default)
    'http://192.168.0.50:3000',  # for network 
    'http://localhost:8080',  # for localhost (Developlemt)
    'http://192.168.0.50:8080',  # for network (Development)
)

CSRF_TRUSTED_ORIGINS = [
    'http://localhost:3000',  # for localhost (REACT Default)
    'http://192.168.0.50:3000',  # for network 
    'http://localhost:8080',  # for localhost (Developlemt)
    'http://192.168.0.50:8080',  # for network (Development)
]

MIDDLEWARE = [
...
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'corsheaders.middleware.CorsMiddleware',
...
Run Code Online (Sandbox Code Playgroud)

]

在浏览器上,必须发送 Axios 请求标头,并且在服务器站点上必须允许该标头。如果不是,则会出现错误消息。

预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 access-control-allow-origin。

到目前为止,我们都在玩头球。如果需要,您可以添加更多标头,例如:

CORS_ALLOW_HEADERS = [
'accept',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
]
Run Code Online (Sandbox Code Playgroud)

干杯:)


mas*_*nun 8

如果有人回到这个问题并决定编写自己的中间件,这是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
Run Code Online (Sandbox Code Playgroud)


Dhr*_*eja 5

根据文档,对于Django版本1.1或更高版本,可以将自定义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
Run Code Online (Sandbox Code Playgroud)

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

MIDDLEWARE = [
  .
  .
  'django.middleware.clickjacking.XFrameOptionsMiddleware',
  'yourproject.middleware.open_access_middleware'
]
Run Code Online (Sandbox Code Playgroud)

十分简单!


jno*_*wak 5

好吧,我不认识大家,但是:

这里使用 python 3.6 和 django 2.2

在 settings.py 中将 MIDDLEWARE_CLASSES 重命名为 MIDDLEWARE 有效。


use*_*966 5

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

第 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
Run Code Online (Sandbox Code Playgroud)

第二步:注册一个中间件

在您的项目 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',

    ]
Run Code Online (Sandbox Code Playgroud)

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

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


S K*_*mar 5

首先安装django包

pip install django-cors-headers
Run Code Online (Sandbox Code Playgroud)

并添加到设置文件中的应用程序

INSTALLED_APPS = (
...
'corsheaders',
...
)
Run Code Online (Sandbox Code Playgroud)

然后将cors中间件添加到设置文件中

MIDDLEWARE = [
...,
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
...,
]
Run Code Online (Sandbox Code Playgroud)

最后添加跨域白名单

#CORS_ORIGIN_ALLOW_ALL = True
#CORS_ALLOW_CREDENTIALS = True
#CORS_ALLOW_HEADERS = ['*']
CORS_ORIGIN_WHITELIST = ('http://localhost:5000',)
Run Code Online (Sandbox Code Playgroud)

这将很容易解决cors错误。快乐编码