Параметр expose_headers
Параметр expose_headers передаётся в middleware
CORSMiddleware
и задаёт список заголовков ответа, которые браузер
разрешает читать JavaScript-коду на стороне клиента
при кросс-доменных запросах. По умолчанию браузер
открывает клиенту лишь несколько «безопасных» заголовков,
поэтому все остальные нужно явно перечислить в этом параметре.
Значением может быть список строк или строка '*',
разрешающая чтение всех заголовков.
Синтаксис
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
expose_headers=[...]
)
Пример
Давайте разрешим клиенту читать заголовок
X-Total-Count из ответа:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=['http://localhost:3000'],
expose_headers=['X-Total-Count']
)
@app.get('/items')
def items():
res = JSONResponse({'items': [1, 2, 3]})
res.headers['X-Total-Count'] = '3'
return res
В ответе появится заголовок
Access-Control-Expose-Headers: X-Total-Count,
и JavaScript на клиенте сможет прочитать значение
X-Total-Count.
Пример
Давайте разрешим чтение нескольких заголовков сразу:
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=['http://localhost:3000'],
expose_headers=['X-Total-Count', 'X-Page', 'X-Per-Page']
)
@app.get('/items')
def items():
res = JSONResponse({'items': [1, 2, 3]})
res.headers['X-Total-Count'] = '3'
res.headers['X-Page'] = '1'
res.headers['X-Per-Page'] = '10'
return res
В ответе появится заголовок
Access-Control-Expose-Headers: X-Total-Count, X-Page, X-Per-Page.
Пример
Давайте разрешим чтение всех заголовков с помощью
строки '*':
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
app = FastAPI()
app.add_middleware(
CORSMiddleware,
allow_origins=['http://localhost:3000'],
expose_headers=['*']
)
@app.get('/')
def index():
return {'text': 'hello'}
Результат выполнения кода для адреса /:
{"text": "hello"}
В ответе появится заголовок
Access-Control-Expose-Headers: *.
Обратите внимание, что значение '*'
поддерживается не всеми браузерами,
поэтому на практике надёжнее перечислять
нужные заголовки явно.
Смотрите также
-
middleware
CORSMiddleware,
который настраивает кросс-доменные запросы -
параметр
allow_headers,
который задаёт разрешённые заголовки запроса -
параметр
allow_origins,
который задаёт список разрешённых источников -
параметр
allow_credentials,
который разрешает передачу учётных данных