8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何在 Django REST Framework 上启用 CORS

bartolo-otrit 2月前

65 0

如何在 Django REST Framework 上启用 CORS?参考资料没有太大帮助,它说我可以通过中间件来实现,但我该怎么做呢?

如何在 Django REST Framework 上启用 CORS? 参考资料 没有太大帮助,它说我可以通过中间件来实现,但我该怎么做呢?

帖子版权声明 1、本帖标题:如何在 Django REST Framework 上启用 CORS
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由bartolo-otrit在本站《django》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 您在问题中引用的链接建议使用 django-cors-headers ,其 文档 说要安装该库

    python -m pip install django-cors-headers
    

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

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

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

    MIDDLEWARE = [
        ...,
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.common.CommonMiddleware',
        ...,
    ]
    

    并指定 CORS 的域,例如:

    CORS_ALLOWED_ORIGINS = [
        'http://localhost:3030',
    ]
    

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

  • 你知道还有其他方法可以做到这一点,而不需要安装新的依赖项吗?我现在正在尝试创建一个中间件类

  • @JulioMarins,既然这个版本随时可用、易于安装,并且有 12 个版本、21 个贡献者、超过 800 个星星和超过 100 个分支,为什么还要编写自己的版本呢?

  • 您确实有道理,但是由于简单的 CORS 只需要一个标头 Access-Control-Allow-Origin:* 我不明白为什么要加载整个东西,因此我将在您的答案中提供另一种方法来执行此操作,以便两种方法都可以使用。参考:[link(]enable-cors.org/server.html)

  • @JulioMarins,那将是铁锤式的方法。如果您查看我提供的配置链接,您会发现 django-cors-headers 比这灵活得多。如果您希望创建自己的类,请随意。但我会使用那个库。

  • @Chris 我认为您应该添加 CORS_ORIGIN_WHITELIST 以便将调用主机列入白名单。

  • python -m pip install django-cors-headers
    

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

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

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

    MIDDLEWARE = [
        ...,
        'corsheaders.middleware.CorsMiddleware',
        'django.middleware.common.CommonMiddleware',
        ...,
    ]
    
    CORS_ALLOW_ALL_ORIGINS = True # If this is used then `CORS_ALLOWED_ORIGINS` will not have any effect
    CORS_ALLOW_CREDENTIALS = True
    CORS_ALLOWED_ORIGINS = [
        'http://localhost:3030',
    ] # If this is used, then not need to use `CORS_ALLOW_ALL_ORIGINS = True`
    CORS_ALLOWED_ORIGIN_REGEXES = [
        'http://localhost:3030',
    ]
    

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

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

  • 将你添加到@Chris 的答案中的四行添加到我的答案中是必要的,这样才能让它发挥作用。

  • 为什么 CORS_ORIGIN_ALLOW_ALL = True,但 CORS_ORIGIN_WHITELIST 仍处于设置状态?文档似乎表明这不是必需的,并且似乎使此处的答案令人困惑。

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

  • 还要记住“corsheaders.middleware.CorsMiddleware”需要位于列表的顶部,否则连接可能会在到达它之前被拒绝。

  • 你可以使用自定义中间件来实现,尽管你知道最好的选择是使用经过测试的包方法 django-cors-headers 。话虽如此,以下是解决方案:

    创建以下结构和文件:

    –myapp /中间件/__init__.py

    from corsMiddleware import corsMiddleware
    

    –myapp /中间件/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
    )
    
  • Kav 2月前 0 只看Ta
    引用 14

    谢谢 Julio!您的中间件代码应该使用 @masnun 代码示例进行更新。此外,导入对我来说不起作用,从 . 导入可以解决问题:从 . 导入 corsMiddleware

  • 这个怎么办?'corsheaders.middleware.CorsMiddleware',不需要添加吗?

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

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

    非常简单!

  • Cow 2月前 0 只看Ta
    引用 18

    之前发布的方法使用 MIDDLEWARE_CLASSES 而不是 MIDDLEWARE。此技术有效,因此不必要投反对票 :) @JulioMarins

  • mja 2月前 0 只看Ta
    引用 19

    兄弟,解决方案是一样的。你争论的是 Django 版本的实现。你的代码在 open_access_middleware 上的缩进也是错误的。

  • 已更新至 2021 年 ,允许来自任何来源的 CORS 的步骤如下。

    步骤 1:安装所需的库

    pip install django-cors-headers
    

    INSTALLED_APPS 的适当位置添加 settings.py - 在 rest_framework 应用程序之后和之前 myapp

    'rest_framework',
    'corsheaders',
    'myapp.apps.MyAppConfig',
    

    步骤 3:允许您的 API 的来源(在 settings.py )

    CORS_ORIGIN_WHITELIST = (
    'http://localhost:3000',  # for localhost (REACT Default)
    'http://192.168.10.45:3000', # for network
    )
    
返回
作者最近主题: