Параметр allow_origin_regex
Параметр allow_origin_regex передаётся в
CORSMiddleware
и задаёт регулярное выражение, которому должен соответствовать
заголовок Origin входящего запроса.
Если источник совпадает с шаблоном, middleware добавляет
в ответ заголовок Access-Control-Allow-Origin
с этим источником. Параметр применяется к приложению FastAPI
через метод add_middleware.
В отличие от allow_origins, где перечисляются
точные строки, здесь можно описать целые группы доменов
одним шаблоном.
Синтаксис
app.add_middleware(
CORSMiddleware,
allow_origin_regex=pattern
)
Пример
Давайте разрешим запросы со всех поддоменов сайта example.com:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origin_regex=r'https://.*\.example\.com',
allow_methods=['*'],
allow_headers=['*']
)
@app.get('/')
def index():
return {'text': 'hello'}
Теперь запрос с заголовком
Origin: https://user.example.com получит ответ
с заголовком Access-Control-Allow-Origin: https://user.example.com.
А запрос с Origin: https://other.com будет отклонён.
Пример
Давайте разрешим локальную разработку на любом порту
через шаблон с localhost:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origin_regex=r'http://localhost:\d+',
allow_methods=['GET', 'POST'],
allow_headers=['*']
)
@app.get('/article')
def article():
return {'title': 'article'}
Запрос с Origin: http://localhost:3000 или
Origin: http://localhost:8080 будет разрешён,
так как оба адреса соответствуют шаблону.
Пример
Давайте проверим поведение через тестовый запрос с помощью
TestClient:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.testclient import TestClient
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origin_regex=r'https://.*\.example\.com',
allow_methods=['*'],
allow_headers=['*']
)
@app.get('/')
def index():
return {'text': 'hello'}
client = TestClient(app)
res = client.get('/', headers={'Origin': 'https://user.example.com'})
print(res.headers.get('access-control-allow-origin'))
Результат выполнения кода:
"https://user.example.com"
Смотрите также
-
класс
CORSMiddleware,
который настраивает политику CORS для приложения -
параметр
allow_origins,
который задаёт список точных разрешённых источников -
параметр
allow_methods,
который задаёт разрешённые HTTP-методы -
параметр
allow_headers,
который задаёт разрешённые заголовки запроса