microdot.cors — Cross-Origin Resource Sharing

Добавляет заголовки, необходимые браузеру, чтобы разрешить JavaScript, выполняющемуся на одном источнике, вызывать ваши размещённые на камере эндпоинты на другом источнике. Класс подключается к обработчику OPTIONS приложения (для предварительных запросов preflight) и к хуку after-request (для заголовков 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 из preflight-запроса).

max_age

Количество секунд, в течение которых браузер может кэшировать результат preflight-запроса. Пропуск означает, что браузер повторно проверяет каждый preflight-запрос.

handle_cors

Если False, класс настраивается, но фактически не присоединяет себя – полезно, когда вы хотите вручную объединить вывод get_cors_headers() с другим промежуточным ПО.

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

Присоединяется к app, если создание было отложено.

get_cors_headers(request) dict

Вычисляет набор заголовков Access-Control-*, применимых к request. Используется внутренне хуком after-request; приложения могут вызывать его напрямую при формировании заголовков 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, или None, чтобы опустить заголовок Access-Control-Expose-Headers. Отражает аргумент конструктора expose_headers.

allowed_headers: list | None

Список имён заголовков запроса, принимаемых при межсайтовых запросах, в нижнем регистре, или None для «отражать то, что запросил preflight». Отражает аргумент конструктора allowed_headers (конструктор приводит список к нижнему регистру перед сохранением).

max_age: int | None

Количество секунд, в течение которых браузер может кэшировать ответ на preflight-запрос, или None, чтобы опустить заголовок Access-Control-Max-Age. Отражает аргумент конструктора 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}

Preflight-запрос OPTIONS обрабатывается автоматически; камера возвращает соответствующие заголовки Access-Control-* и 204 No Content. Фактические ответы GET / POST и т.д. получают заголовок Access-Control-Allow-Origin через зарегистрированный хук after-request.