microdot.cors --- 跨源资源共享

添加浏览器所需的标头,以允许运行在某一源上的 JavaScript 调用你托管于摄像头上、位于不同源的端点。该类会将自身接入应用程序的 OPTIONS 处理程序(用于预检请求)和请求后钩子(用于在正常响应上添加 Access-Control-* 标头)。

class CORS

class microdot.cors.CORS(app: Microdot | None = None, allowed_origins=None, allow_credentials: bool = False, allowed_methods: list | None = None, expose_headers: list | None = None, allowed_headers: list | None = None, max_age: int | None = None, handle_cors: bool = True)
app

要附加到的 microdot.Microdot 实例。可以为 None 以延迟附加;稍后调用 initialize()

allowed_origins

源字符串列表(["https://app.example.com"])或字面量 '*' 以允许任意源。与此列表不匹配的源将不会获得 CORS 标头,浏览器会将此解释为“此请求不被允许”。

allow_credentials

如果为 True,则添加 Access-Control-Allow-Credentials: true,以便浏览器在跨源请求中发送 cookie 和身份验证标头。对于任何需要凭据的请求,不能与 allowed_origins='*' 一起使用(浏览器会拒绝该组合)。

allowed_methods

浏览器可用于跨源的方法列表(['GET', 'POST'])。None 表示任意方法。

expose_headers

浏览器可向 JavaScript 公开的响应标头名称列表。

allowed_headers

客户端可在跨源请求中包含的请求标头名称列表。None 表示任意(回显预检请求的 Access-Control-Request-Headers)。

max_age

浏览器可缓存预检结果的秒数。省略该项意味着浏览器会对每次预检重新校验。

handle_cors

如果为 False,该类已配置但不会实际附加自身——当你想要手动将其 get_cors_headers() 的输出与其他中间件结合时很有用。

initialize(app: Microdot, handle_cors: bool = True)

如果构造时延迟了附加,则附加到 app

get_cors_headers(request) dict

计算适用于 requestAccess-Control-* 标头集合。由请求后钩子内部使用;应用程序在从自定义中间件发出 CORS 标头时可直接调用它。

allowed_origins: list | str | None

已配置的源列表,或字面量 '*'。映射构造函数参数 allowed_origins;可在运行时重新赋值以更改策略而无需重建对象。

allow_credentials: bool

是否在匹配的请求上发出 Access-Control-Allow-Credentials: true。映射构造函数参数 allow_credentials

allowed_methods: list | None

允许跨源的方法名称列表,或表示“任意”的 None。映射构造函数参数 allowed_methods

expose_headers: list | None

浏览器可向 JavaScript 公开的响应标头列表,或表示省略 Access-Control-Expose-Headers 标头的 None。映射构造函数参数 expose_headers

allowed_headers: list | None

接受的跨源请求标头名称列表(小写),或表示“回显预检请求所要求的任意内容”的 None。映射构造函数参数 allowed_headers(构造函数在存储前会将列表转为小写)。

max_age: int | None

浏览器可缓存预检响应的秒数,或表示省略 Access-Control-Max-Age 标头的 None。映射构造函数参数 max_age

示例:

from microdot import Microdot
from microdot.cors import CORS

app = Microdot()
CORS(app,
     allowed_origins=['https://dashboard.example.com'],
     allow_credentials=True,
     max_age=86400)

@app.get('/api/status')
async def status(request):
    return {'ok': True}

预检 OPTIONS 请求会被自动处理;摄像头返回相应的 Access-Control-* 标头和 204 No Content。实际的 GET / POST 等响应会通过已注册的请求后钩子获得 Access-Control-Allow-Origin 标头。