跳转到主要内容

django-cors-headers是一个用于处理跨源资源共享(CORS)所需的服务器头的Django应用程序。

项目描述

https://img.shields.io/github/actions/workflow/status/adamchainz/django-cors-headers/main.yml.svg?branch=main&style=for-the-badge https://img.shields.io/badge/Coverage-100%25-success?style=for-the-badge https://img.shields.io/pypi/v/django-cors-headers.svg?style=for-the-badge https://img.shields.io/badge/code%20style-black-000000.svg?style=for-the-badge pre-commit

一个Django应用程序,它向响应添加跨源资源共享(CORS)头。这允许从其他源在浏览器中向您的Django应用程序发出请求。


通过我的书籍提高您的Django和Git技能 (请访问我的书籍).


关于CORS

添加CORS头允许您的资源在其他域上被访问。在添加头之前理解其含义很重要,因为您可能无意中将站点的私有数据向他人开放。

以下是一些关于此主题的好资源

要求

支持 Python 3.8 到 3.12。

支持 Django 3.2 到 5.1。

设置

使用 pip 安装

python -m pip install django-cors-headers

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

INSTALLED_APPS = [
    ...,
    "corsheaders",
    ...,
]

请确保添加尾随逗号,否则可能会出现 ModuleNotFoundError 错误(请参阅 这篇博客文章)。

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

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

CorsMiddleware 应尽可能放在高位,特别是在任何可能生成响应的中间件之前,例如 Django 的 CommonMiddleware 或 Whitenoise 的 WhiteNoiseMiddleware。如果它不在前面,它将无法将这些响应的 CORS 头部添加到其中。

关于

django-cors-headers 由 Otto Yiu 在 2013 年 1 月创建。从 2015 年 8 月开始不再维护,并在 2016 年 1 月被 Zeste de Savoir 的 Laville Augustin 以 django-cors-middleware 包的形式分叉。2016 年 9 月,Adam Johnson、Ed Morley 等人从 Otto Yiu 那里获得了 django-cors-headers 的维护责任(请参阅 问题 110)。基本上,分叉的 django-cors-middleware 中的所有更改都已合并,或者以不同的方式重新实现,因此应该可以切换回来。如果有尚未合并的功能,请为此功能打开一个问题。

django-cors-headers 在其历史中拥有 40+ 贡献者;感谢每一位。

配置

在 Django 设置中配置中间件的行为。您必须设置以下三个设置之一

  • CORS_ALLOWED_ORIGINS

  • CORS_ALLOWED_ORIGIN_REGEXES

  • CORS_ALLOW_ALL_ORIGINS

CORS_ALLOWED_ORIGINS: Sequence[str]

允许进行跨站 HTTP 请求的来源列表。此设置中的来源将被允许,并且请求的来源将在 access-control-allow-origin 标头中回显给客户端。默认为 []

来源由 CORS RFC 第 3.2 节 定义为 URI 方案 + 主机名 + 端口,或以下特殊值之一 'null''file://'。默认端口(HTTPS = 443,HTTP = 80)是可选的。

特殊值 null 由浏览器在 “隐私敏感环境” 中发送,例如当客户端从 file:// 域运行时。特殊值 file:// 是 Chrome 在 Android 上的一些版本意外发送的,如 此错误 所示。

示例

CORS_ALLOWED_ORIGINS = [
    "https://example.com",
    "https://sub.example.com",
    "http://localhost:8080",
    "http://127.0.0.1:9000",
]

以前这个设置被称为 CORS_ORIGIN_WHITELIST,它仍然作为一个别名工作,新名称具有优先级。

CORS_ALLOWED_ORIGIN_REGEXES: Sequence[str | Pattern[str]]

表示匹配允许进行跨站 HTTP 请求的来源的正则表达式的字符串列表。默认为 []。当 CORS_ALLOWED_ORIGINS 不切实际时很有用,例如当您有大量子域时。

示例

CORS_ALLOWED_ORIGIN_REGEXES = [
    r"^https://\w+\.example\.com$",
]

以前这个设置被称为 CORS_ORIGIN_REGEX_WHITELIST,它仍然作为一个别名工作,新名称具有优先级。

CORS_ALLOW_ALL_ORIGINS: bool

如果为 True,则允许所有来源。将忽略限制允许来源的其他设置。默认为 False

将此设置为 True 可能是 危险的,因为它允许任何网站向您的网站发送跨源请求。通常,您会希望使用 CORS_ALLOWED_ORIGINSCORS_ALLOWED_ORIGIN_REGEXES 限制允许的源列表。

之前这个设置被称为 CORS_ORIGIN_ALLOW_ALL,它仍然作为别名使用,但新名称具有优先级。


以下是一些可选设置,默认值可能就足够了。

CORS_URLS_REGEX: str | Pattern[str]

一个正则表达式,用于限制将发送 CORS 标头的 URL。默认为 r'^.*$',即匹配所有 URL。当您只需要在网站的某个部分使用 CORS 时很有用,例如在 /api/ 的 API 上。

示例

CORS_URLS_REGEX = r"^/api/.*$"

CORS_ALLOW_METHODS: Sequence[str]

允许实际请求的 HTTP 动词列表。默认值

CORS_ALLOW_METHODS = (
    "DELETE",
    "GET",
    "OPTIONS",
    "PATCH",
    "POST",
    "PUT",
)

默认值可以导入为 corsheaders.defaults.default_methods,这样您就可以扩展它以包含您自己的方法。这使您能够跟上任何未来的更改。例如

from corsheaders.defaults import default_methods

CORS_ALLOW_METHODS = (
    *default_methods,
    "POKE",
)

CORS_ALLOW_HEADERS: Sequence[str]

您允许浏览器请求的非标准 HTTP 标头列表。在响应中设置 Access-Control-Allow-Headers 标头,以针对 预检请求。默认值

CORS_ALLOW_HEADERS = (
    "accept",
    "authorization",
    "content-type",
    "user-agent",
    "x-csrftoken",
    "x-requested-with",
)

默认值可以导入为 corsheaders.defaults.default_headers,这样您就可以扩展它以包含您自己的标头。这使您能够跟上任何未来的更改。例如

from corsheaders.defaults import default_headers

CORS_ALLOW_HEADERS = (
    *default_headers,
    "my-custom-header",
)

CORS_EXPOSE_HEADERS: Sequence[str]

要暴露给浏览器的额外 HTTP 标头列表,除了默认的 CORS 安全列表响应标头 之外。如果非空,则这些在 Access-Control-Expose-Headers 标头 中声明。默认为 []

CORS_PREFLIGHT_MAX_AGE: int

浏览器可以缓存预检响应的秒数。在预检响应中设置 Access-Control-Max-Age 标头。如果此值为 0(或任何假值),则不会发送最大年龄标头。默认为 86400(一天)。

注意: 浏览器在发送某些“非简单”请求之前会发送 预检请求,以检查它们是否被允许。有关更多信息,请参阅 CORS MDN 文章

CORS_ALLOW_CREDENTIALS: bool

如果设置为 True,则允许将 cookies 包含在跨站 HTTP 请求中。在预检和正常响应中设置 Access-Control-Allow-Credentials 标头。默认为 False

注意:在 Django 2.1 中添加了 SESSION_COOKIE_SAMESITE 设置,默认设置为 'Lax',这将阻止 Django 的会话 cookie 跨域发送。如果您需要绕过此安全限制,请将设置更改为 'None'

CORS_ALLOW_PRIVATE_NETWORK: bool

如果设置为 True,则允许从“公共”IP 网站向“私有”IP 上的此服务器发送请求。在这种情况下,浏览器会发送一个额外的 CORS 标头 access-control-request-private-network,对于 OPTIONS 响应,必须包含 access-control-allow-private-network: true

请参阅

CSRF 集成

大多数网站都需要利用 Django 提供的跨站请求伪造保护(Cross-Site Request Forgery protection)。CORS 和 CSRF 是独立的,Django 无法使用您的 CORS 配置来免除其在对安全请求执行 Referer 检查的站点。要这样做,请使用其 CSRF_TRUSTED_ORIGINS 设置。例如

CORS_ALLOWED_ORIGINS = [
    "https://read-only.example.com",
    "https://read-and-write.example.com",
]

CSRF_TRUSTED_ORIGINS = [
    "https://read-and-write.example.com",
]

信号

如果您有一个需要上述配置之外的功能的使用场景,您可以附加代码来检查是否允许给定的请求。例如,这可以用于从模型中读取允许的来源列表。将任意数量的处理器附加到 check_request_enabled Django 信号,它提供 request 参数(在您的处理器中使用 **kwargs 来防止未来添加任何参数)。如果任何附加到信号的处理器返回一个真值,则请求将被允许。

例如,您可以定义一个处理器如下

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

from myapp.models import MySite


def cors_allow_mysites(sender, request, **kwargs):
    return MySite.objects.filter(host=request.headers["origin"]).exists()


check_request_enabled.connect(cors_allow_mysites)

然后在应用程序就绪时使用 Django AppConfig 连接到它

# 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

信号的常见用途是允许 所有 来源访问 URL 的子集,同时允许一组正常的来源访问 所有 URL。仅使用正常配置是无法实现的,但可以使用信号处理器来实现。

首先将 CORS_ALLOWED_ORIGINS 设置为允许访问每个 URL 的受信任来源列表,然后向 check_request_enabled 添加一个处理器,以允许无限制 URL 的 CORS,无论来源如何。例如

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


def cors_allow_api_to_everyone(sender, request, **kwargs):
    return request.path.startswith("/api/")


check_request_enabled.connect(cors_allow_api_to_everyone)

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装软件包 的信息。

源分布

django_cors_headers-4.4.0.tar.gz (21.2 kB 查看散列)

上传时间

构建的发行版

django_cors_headers-4.4.0-py3-none-any.whl (12.8 kB 查看哈希值)

上传时间 Python 3

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页