在 Django 中根据端点设置不同的 CORS 规则

Posted

技术标签:

【中文标题】在 Django 中根据端点设置不同的 CORS 规则【英文标题】:Set up different CORS rules based on the endpoint in Django 【发布时间】:2021-01-08 15:07:22 【问题描述】:

我正在尝试找出一种方法来根据后端端点前端会命中的不同 CORS 规则。

所以我可以拥有

/api 端点与 CORS 域白名单和

/public-api 没有 CORS 域白名单。

这是必需的,因为我有两个用于我自己的前端的内部端点,以及一个可以安装在任何第 3 方域中的公共 JS 小部件。

我查看了 django-cors-headers 库,但它是正则表达式配置

CORS_ORIGIN_REGEX_WHITELIST = []

允许来自域列表的请求通过。

就我而言,我需要一种方法来使用正则表达式(或其他方法)来让请求通过或不通过我的端点。

【问题讨论】:

我不确定您如何处理请求 cors 标头。但是对于响应 cors 标头,您可以创建自定义中间件并在视图(或装饰器)中设置一些参数,并且基于它自定义中间件将更改响应中的标头。中间件参考github.com/adamchainz/django-cors-headers/blob/master/src/… 所以你的装饰器可以像 django 中的csrf_exempt 【参考方案1】:

django-cors-headers 允许您指定一个自定义处理函数,该函数将检查是否应允许请求。在你的情况下,你可以使用这样的东西:

# myapp/handlers.py
from corsheaders.signals import check_request_enabled

def cors_allow_particular_urls(sender, request, **kwargs):
    return request.path.startswith('/public-api/')

check_request_enabled.connect(cors_allow_mysites)

handlers.py 需要在应用配置中加载:

# myapp/__init__.py

default_app_config = 'myapp.apps.MyAppConfig'
# myapp/apps.py

from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = 'myapp'

    def ready(self):
        # Makes sure all signal handlers are connected
        from myapp import handlers  # noqa

更多信息在这里:https://github.com/adamchainz/django-cors-headers#signals

【讨论】:

【参考方案2】:

如果您可以使用单独的前缀(例如:/private/<something>)来使用您的私人网址,则可以使用CORS_URLS_REGEX=r'^/private/.*$'

您可以在此处阅读更多信息: https://github.com/adamchainz/django-cors-headers#cors_urls_regex

【讨论】:

这真的很接近。但是,它是一个全局关闭开关。它不允许我使用基于 url 前缀的 ALTERNATE CORS 标头进行响应。

以上是关于在 Django 中根据端点设置不同的 CORS 规则的主要内容,如果未能解决你的问题,请参考以下文章

CORS 在 Django 中不起作用,但设置似乎正确

从 Angular App 到 Django REST API 的 API 请求 - 被 CORS 阻止

使用针对 signalR 端点的不同策略覆盖全局 CORS 策略

ExpressJS 不同的域名 - CORS

通过 API 网关为无服务器架构模型代理端点设置 CORS

Django中使用CORS实现跨域请求