CORS 中间件

此中间件提供了一个全面、可配置的 CORS(跨域资源共享)规范的实现,作为 oslo 支持的 python wsgi 中间件。

注意

虽然此中间件支持在规范中使用 * 通配符 origin,但出于安全原因不建议使用此功能。它旨在简化 CORS 的基本用法,实际上意味着“我不关心如何使用它”。在内网环境中,这可能导致数据泄露到内网之外,因此应避免使用。

快速入门

首先,在您的应用程序中包含中间件

from oslo_middleware import cors

app = cors.CORS(your_wsgi_application)

其次,添加您需要的允许的 origin

app.add_origin(allowed_origin='https://website.example.com:443',
               allow_credentials=True,
               max_age=3600,
               allow_methods=['GET','PUT','POST','DELETE'],
               allow_headers=['X-Custom-Header'],
               expose_headers=['X-Custom-Header'])

# ... add more origins here.

oslo_config 的配置

提供了一个工厂方法,以简化使用 oslo_config 配置 CORS 域。

from oslo_middleware import cors
from oslo_config import cfg

app = cors.CORS(your_wsgi_application, cfg.CONF)

在您的应用程序的配置文件中,包含如下配置块

[cors]
allowed_origin=https://website.example.com:443,https://website2.example.com:443
max_age=3600
allow_methods=GET,POST,PUT,DELETE
allow_headers=X-Custom-Header
expose_headers=X-Custom-Header

pastedeploy 的配置

如果您的应用程序正在使用 pastedeploy,则以下配置块将添加 CORS 支持。

[filter:cors]
use = egg:oslo.middleware#cors
allowed_origin=https://website.example.com:443,https://website2.example.com:443
max_age=3600
allow_methods=GET,POST,PUT,DELETE
allow_headers=X-Custom-Header
expose_headers=X-Custom-Header

如果您的应用程序正在使用 pastedeploy,但同时也希望使用 oslo_config 中的现有配置以简化配置点,可以按如下方式操作。

[filter:cors]
use = egg:oslo.middleware#cors
oslo_config_project = oslo_project_name

# Optional field, in case the program name is different from the project:
oslo_config_program = oslo_project_name-api

配置选项

cors

allowed_origin
类型:

列表

默认值:

<None>

指示是否允许与请求“origin”标头中接收到的域共享此资源。格式:“<protocol>://<host>[:<port>]”,不带尾部斜杠。示例:https://horizon.example.com

allow_credentials
类型:

布尔值

默认值:

True

指示实际请求是否可以包含用户凭据

expose_headers
类型:

列表

默认值:

[]

指示哪些标头可以安全地暴露给 API。默认值为 HTTP 简单标头。

max_age
类型:

整数

默认值:

3600

CORS 预检请求的最大缓存时间。

allow_methods
类型:

列表

默认值:

['OPTIONS', 'GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'TRACE', 'PATCH']

指示实际请求期间可以使用哪些方法。

allow_headers
类型:

列表

默认值:

[]

指示实际请求期间可以使用哪些标头字段名称。

模块文档

class oslo_middleware.cors.AllowedOrigin
class oslo_middleware.cors.CORS(application: WSGIApplication | None, conf: dict[str, ty.Any] | cfg.ConfigOpts | None = None)

CORS 中间件。

此中间件允许 WSGI 应用程序为多个配置的域提供 CORS 标头。

有关更多信息,请参阅 http://www.w3.org/TR/cors/

add_origin(allowed_origin: str | list[str], allow_credentials: bool = True, expose_headers: list[str] | None = None, max_age: int | None = None, allow_methods: list[str] | None = None, allow_headers: list[str] | None = None) None

添加另一个 origin 到此过滤器。

参数:
  • allowed_origin – 允许的 origin 的协议、主机和端口。

  • allow_credentials – 是否允许凭据。

  • expose_headers – 要暴露的标头列表。

  • max_age – 最大缓存持续时间。

  • allow_methods – 允许的 HTTP 方法列表。

  • allow_headers – 允许客户端的 HTTP 标头列表。

返回值:

classmethod factory(global_conf: dict[str, ty.Any] | None, **local_conf: ty.Any) ty.Callable[[WSGIApplication], base.MiddlewareType]

paste.deploy 的工厂方法

allowed_origin: 允许的 origin 的协议、主机和端口。 allow_credentials: 是否允许凭据。 expose_headers: 要暴露的标头列表。 max_age: 最大缓存持续时间。 allow_methods: 允许的 HTTP 方法列表。 allow_headers: 允许客户端的 HTTP 标头列表。

process_response(response: Response, request: Request | None = None) Response

检查 CORS 标头,并在必要时进行装饰。

执行两个检查。首先,如果发出 OPTIONS 请求,则让应用程序处理它,并(如果需要)用预检标头装饰响应。在这种情况下,如果底层应用程序抛出 404(即如果底层应用程序不处理 OPTIONS 请求,则会覆盖响应代码)。

在所有其他请求的情况下,应用常规请求标头。

exception oslo_middleware.cors.InvalidOriginError(origin: str)

当 Origin 无效时引发的异常。

oslo_middleware.cors.filter_factory(global_conf: dict[str, ty.Any] | None, **local_conf: ty.Any) ty.Callable[[WSGIApplication], base.MiddlewareType]

paste.deploy 的工厂方法

allowed_origin: 允许的 origin 的协议、主机和端口。 allow_credentials: 是否允许凭据。 expose_headers: 要暴露的标头列表。 max_age: 最大缓存持续时间。 allow_methods: 允许的 HTTP 方法列表。 allow_headers: 允许客户端的 HTTP 标头列表。

oslo_middleware.cors.set_defaults(**kwargs: Opt) None

覆盖配置选项的默认值。

此方法允许项目覆盖默认 CORS 选项值。例如,它可能希望提供一组合理的默认标头,使其只需进行最少的额外配置即可正常工作。

参数:
  • allow_credentials (bool) – 是否允许凭据。

  • expose_headers (List of Strings) – 要暴露的标头列表。

  • max_age (Int) – 最大缓存持续时间(秒)。

  • allow_methods (List of Strings) – 允许的 HTTP 方法列表。

  • allow_headers (List of Strings) – 允许客户端的 HTTP 标头列表。