| Response.body | string | Содержимое тела ответа, часто используемое для извлечения динамических данных (см. примеры здесь) и при проверке наличия контента с помощью проверок. См. Params.responseType и options.discardResponseBodies, чтобы узнать, как отбрасывать тело, когда оно не нужно (и для экономии памяти), или при обработке тел с двоичными данными. |
| Ответные файлы cookie | объект | Ответные файлы cookie. Свойства объекта — это имена файлов cookie, а значение — массив объектов файлов cookie (с полями имени, значения, домена, пути, httpOnly, secure, maxAge и expires). |
| Response.error | строка | Сообщение об ошибке, если при попытке отправить запрос возникла не-HTTP-ошибка. |
| Response.error_code | номер | Код ошибки, если произошла не-HTTP-ошибка или ошибка 4xx или 5xx HTTP, для него будет установлен конкретный код, описывающий ошибку. (Добавлено в версии 0.24.0) |
| Response.headers | объект | Пары «ключ-значение», представляющие все заголовки HTTP, отправляемые сервером. |
| Response.ocsp.produced_at | число | Если сервер предоставил сжатый ответ OSCP, количество миллисекунд, прошедших с 00:00:00 UTC 1 января 1970 года, представляющее время, когда этот сшитый ответ OCSP был подписан CA (или доверенным CA ответчиком OCSP) |
| Response.ocsp.this_update | номер | Если сервер предоставил сшитый ответ OSCP, количество миллисекунд, прошедших с 1 января 1970 00:00:00 UTC, представляющее время, когда указанный статус был известен как правильный. |
| Response.ocsp.next_update | число | Если сервер предоставил сжатый ответ OSCP, количество миллисекунд, прошедших с 00:00:00 UTC 1 января 1970 года, представляющее время, когда этот сшитый ответ OCSP будет обновляется CA (или доверенным CA ответчиком OCSP).![]() |
| Response.ocsp.revocation_reason | строка | Причина отзыва сертификата (если это статус), одна из следующих констант: http.OCSP_REASON_UNSPECIFIED, http.OCSP_REASON_KEY_COMPROMISE, http.OCSP_REASON_CA_COMPROMISE, http.OCSP_REASON_AFFILIATION_CHANGED, http.OCSP_REASON_CUPERSEDSON_9007RED5, OF_OPERATION, http.OCSP_REASON_CERTIFICATE_HOLD, http.OCSP_REASON_REMOVE_FROM_CRL, http.OCSP_REASON_PRIVILEGE_WITHDRAWN или http.OCSP_REASON_AA_COMPROMISE. |
| Response.ocsp.revoked_at | номер | Если сервер предоставил сшитый ответ OSCP, количество миллисекунд, прошедших с 00:00:00 UTC 1 января 1970 года, представляющее время, когда этот сертификат был отозван (если это статус). |
| Response.ocsp.status | string | Статус сертификата, одна из следующих констант: http.OCSP_STATUS_GOOD, http.OCSP_STATUS_REVOKED, http.OCSP_STATUS_UNKNOWN или http.OCSP_STATUS_SERVER_FAILED.![]() |
| Response.proto | строка | Протокол, используемый для выполнения передачи. Возможные значения: «HTTP/1.0», «HTTP/1.1» или «HTTP/2.0». |
| Response.remote_ip | строка | IP-адрес сервера, обрабатывающего запрос. |
| Response.remote_port | номер | Порт, к которому было подключено на стороне сервера. |
| Response.request.body | строка | Содержимое тела запроса. |
| Response.request.cookies | объект | Запросить cookie. Свойства объекта — это имена файлов cookie, а значение — массив объектов файлов cookie (с полями имени, значения и замены). |
| Response.request.headers | объект | Заголовки запроса. |
| Response.request.method | строка | HTTP-метод запроса. |
| Ответ.запрос.url | строка | URL запроса. |
Response. status | номер | Код состояния HTTP, возвращенный сервером. |
| Response.status_text | string | (новое в k6 v0.29.0) Текст состояния HTTP, возвращаемый сервером. |
| Response.timings | объект | Информация о времени выполнения для HTTP-запроса. |
| Время отклика.заблокировано | float | Содержит время (мс), затраченное на блокировку до инициирования запроса. |
| Response.timings.connecting | float | Время (мс), затраченное на установку TCP-соединения с хостом. |
| Response.timings.tls_handshaking | float | Содержит время (мс), потраченное на подтверждение сеанса TLS с хостом. |
| Response.timings.sending | float | Содержит время (мс), потраченное на отправку запроса. |
| Response.timings.waiting | float | Содержит время (мс), потраченное на ожидание ответа сервера.![]() |
| Время ответа.получение | float | Содержит время (мс), затраченное на получение данных ответа. |
| Response.timings.duration | float | Общее время запроса (мс). Это равно отправке + ожиданию + получению, т. е. сколько времени потребовалось удаленному серверу для обработки запроса и ответа без учета начального времени поиска/соединения DNS. |
| Response.tls_cipher_suite | строка | Если был установлен сеанс TLS, используемый набор шифров. |
| Response.tls_version | строка | Если сеанс TLS был установлен, используемая версия SSL/TLS. |
| Response.url | string | URL-адрес, который был получен в конечном итоге (т. е. после любых возможных перенаправлений). |
| Response.clickLink([параметры]) | function | Разбирает ответ как HTML, ищет определенную ссылку и выполняет эквивалент щелчка по этой ссылке на уровне запроса.![]() |
| Response.html() | function | Возвращает объект, поддерживающий Selection.find(селектор). |
| Response.json( [селектор] ) | функция | Анализирует данные тела ответа как JSON и возвращает объект или массив JS. Этот вызов кэширует десериализованные данные JSON, дополнительные вызовы вернут кэшированные данные. Можно указать необязательный селектор для извлечения определенной части данных, см. здесь синтаксис селектора. |
| Response.submitForm( [params] ) | функция | Анализирует ответ как HTML, анализирует указанную форму (по умолчанию ищет элемент «формы») с возможностью переопределения полей, а затем отправляет форму, используя метод формы и действие во внимание. |
Пользовательский ответ — HTML, поток, файл, другие
По умолчанию FastAPI возвращает ответы, используя JSONResponse .
Вы можете переопределить его, вернув Ответ напрямую, как показано в непосредственном ответе на ответ.
Но если вы вернете ответ Response напрямую, данные не будут автоматически преобразованы, и документация не будет автоматически сгенерирована (например, включая определенный «тип носителя» в заголовке HTTP Content-Type как часть сгенерированного OpenAPI).
Но вы также можете объявить Ответ , который вы хотите использовать, в декораторе операции пути .
Содержимое, которое вы возвращаете из функции операции пути , будет помещено внутрь этого ответа .
И если этот Response имеет тип носителя JSON ( ), как в случае с JSONResponse и UJSONResponse , возвращаемые вами данные будут автоматически преобразованы (и отфильтрованы) с помощью любого Pydantic response_model , который вы объявили в декораторе операции пути .
Примечание
Если вы используете класс ответа без типа носителя, FastAPI будет ожидать, что ваш ответ не будет содержать содержимого, поэтому он не будет документировать формат ответа в созданных документах OpenAPI.
Использовать
ORJSONResponse Например, если вы сжимаете производительность, вы можете установить и использовать или json
ORJSONResponse . Импортируйте класс (подкласс) Response , который вы хотите использовать, и объявите его в декоратор операции пути .
Для больших ответов возврат ответа Response напрямую намного быстрее, чем возврат словаря.
Это связано с тем, что по умолчанию FastAPI проверяет каждый элемент внутри и проверяет его сериализуемость с помощью JSON, используя тот же кодировщик, совместимый с JSON, который описан в руководстве. Именно это позволяет возвращать произвольных объектов , например модели базы данных.
Но если вы уверены, что возвращаете контент сериализуем с помощью JSON
jsonable_encoder перед передачей его в класс ответа.
из fastapi импортировать FastAPI
из fastapi.responses импортировать ORJSONResponse
приложение = FastAPI()
@app.get("/items/", response_class=ORJSONResponse)
асинхронное определение read_items():
вернуть ORJSONResponse([{"item_id": "Foo"}])
Наконечник
ORJSONResponse в настоящее время доступен только в FastAPI, но не в Starlette.
HTML-ответ
Чтобы вернуть ответ с HTML непосредственно из FastAPI , используйте HTMLResponse .
- Импорт
HTMLResponse. - Передайте
HTMLResponseв качестве параметраresponse_classвашего декоратора операции пути .
из fastapi импорта FastAPI
из fastapi.responses импортировать HTMLResponse
приложение = FastAPI()
@app.get("/items/", response_class=HTMLResponse)
асинхронное определение read_items():
возвращаться """
<голова>
Здесь немного HTML
голова>
<тело>
Смотри, мама! HTML!
тело>
"""
Вернуть ответ
Как видно из непосредственного возврата ответа, вы также можете переопределить ответ непосредственно в операции пути , вернув его.
Тот же пример выше, возвращающий HTMLResponse , может выглядеть так:
из fastapi импортировать FastAPI
из fastapi.responses импортировать HTMLResponse
приложение = FastAPI()
@app.get("/items/")
асинхронное определение read_items():
html_content = """
<голова>
Здесь немного HTML
голова>
<тело>
Смотри, мама! HTML!
тело>
"""
вернуть HTMLResponse (content = html_content, status_code = 200)
Предупреждение
A Ответ , возвращенный непосредственно вашей функцией обработки пути , не будет документирован в OpenAPI (например, Content-Type не будет документирован) и не будет отображаться в автоматическом интерактивном документы
Документировать в OpenAPI и переопределить
Ответ Если вы хотите переопределить ответ изнутри функции, но в то же время задокументировать «тип носителя» в OpenAPI, вы можете использовать параметр response_class И возвращает объект Response .
Затем response_class будет использоваться только для документирования операции пути OpenAPI , но ваш ответ будет использоваться как есть.
Вернуть
HTMLResponse напрямуюНапример, это может быть что-то вроде:
из fastapi импортировать FastAPI
из fastapi.responses импортировать HTMLResponse
приложение = FastAPI()
определение generate_html_response():
html_content = """
<голова>
Здесь немного HTML
голова>
<тело>
Смотри, мама! HTML!
тело>
"""
вернуть HTMLResponse (content = html_content, status_code = 200)
@app.get("/items/", response_class=HTMLResponse)
асинхронное определение read_items():
вернуть generate_html_response()
В этом примере функция generate_html_response() уже генерирует и возвращает ответ вместо возврата HTML в str .
Возвращая результат вызова generate_html_response() , вы уже возвращаете ответ , который переопределяет поведение FastAPI по умолчанию .
Но поскольку вы прошли HTMLResponse в response_class тоже, FastAPI будет знать, как документировать это в OpenAPI и интерактивных документах в виде HTML с :
Доступные ответы
Вот некоторые из доступных ответов.
Имейте в виду, что вы можете использовать Response для возврата чего-либо еще или даже для создания собственного подкласса.
Технические детали
Вы также можете использовать из starlette.responses import HTMLResponse .
FastAPI предоставляет те же starlette.responses as fastapi.responses просто для удобства разработчика. Но большинство доступных ответов исходит непосредственно от Старлетт.
Ответ Основной класс Response , все остальные ответы наследуются от него.
Вы можете вернуть его напрямую.
Принимает следующие параметры:
-
содержимое— Aстрилибайт. -
status_code— код состояния HTTPint. -
заголовков—dictстрок. -
media_type— Astr, указывающая тип носителя. Например."текст/html".
FastAPI (фактически Starlette) автоматически включает заголовок Content-Length. Он также будет включать заголовок Content-Type, основанный на media_type и добавляющий кодировку для текстовых типов.
из fastapi import FastAPI, Ответ
приложение = FastAPI()
@app.get("/наследие/")
защита get_legacy_data():
данные = """
<шампунь>
<Заголовок>
Нанесите сюда шампунь.
Заголовок>
<Тело>
Здесь вам придется использовать мыло.
Тело>
шампунь>
"""
вернуть ответ (содержание = данные, media_type = "приложение/xml")
HTMLResponse Принимает некоторый текст или байты и возвращает ответ в формате HTML, как вы читали выше.
PlainTextResponse Принимает некоторый текст или байты и возвращает простой текстовый ответ.
из fastapi импортировать FastAPI
из fastapi.responses импортировать PlainTextResponse
приложение = FastAPI()
@app.get("/", response_class=PlainTextResponse)
асинхронная функция main():
вернуть "Привет мир"
Ответ JSON Принимает некоторые данные и возвращает закодированный ответ application/json .
Это ответ по умолчанию, используемый в FastAPI , как вы читали выше.
ORJSONОтвет Быстрый альтернативный ответ JSON с использованием или json , как вы читали выше.
UJSONResponse Альтернативный ответ JSON с использованием ujson .
Предупреждение
ujson менее осторожна, чем встроенная реализация Python, в том, как она обрабатывает некоторые крайние случаи.
из fastapi импортировать FastAPI
из fastapi.responses импортировать UJSONResponse
приложение = FastAPI()
@app.get("/items/", response_class=UJSONResponse)
асинхронное определение read_items():
вернуть [{"item_id": "Foo"}]
Совет
Возможно, ORJSONResponse может быть более быстрой альтернативой.
RedirectResponse Возвращает перенаправление HTTP. По умолчанию использует код состояния 307 (временное перенаправление).
Вы можете вернуть RedirectResponse напрямую:
из fastapi импортировать FastAPI
из fastapi.responses импортировать RedirectResponse
приложение = FastAPI()
@app.get("/тип")
асинхронное определение redirect_typer():
вернуть RedirectResponse("https://typer.
tiangolo.com")
Или вы можете использовать его в параметре response_class :
из fastapi импортировать FastAPI
из fastapi.responses импортировать RedirectResponse
приложение = FastAPI()
@app.get("/fastapi", response_class=RedirectResponse)
асинхронное определение redirect_fastapi():
вернуть "https://fastapi.tiangolo.com"
Если вы это сделаете, вы можете вернуть URL-адрес непосредственно из вашей операции пути функции.
В этом случае используемый status_code будет кодом по умолчанию для RedirectResponse , то есть 307 .
Вы также можете использовать параметр status_code в сочетании с параметром response_class :
из fastapi импортировать FastAPI
из fastapi.responses импортировать RedirectResponse
приложение = FastAPI()
@app.get("/pydantic", response_class=RedirectResponse, status_code=302)
асинхронное определение redirect_pydantic():
вернуть "https://pydantic-docs.
helpmanual.io/"
StreamingResponse Берет асинхронный генератор или обычный генератор/итератор и передает тело ответа.
из fastapi импортировать FastAPI
из fastapi.responses импортировать StreamingResponse
приложение = FastAPI()
асинхронное определение fake_video_streamer():
для я в диапазоне (10):
yield b"некоторые поддельные байты видео"
@приложение.получить("/")
асинхронная функция main():
вернуть StreamingResponse (fake_video_streamer ())
Использование
StreamingResponse с файлоподобными объектами Если у вас есть файлоподобный объект (например, объект, возвращаемый open() ), вы можете создать функцию-генератор для итерации по этому файлоподобному объекту.
Таким образом, вам не нужно сначала читать все это в памяти, и вы можете передать эту функцию генератора StreamingResponse и вернуть ее.
Сюда входит множество библиотек для взаимодействия с облачным хранилищем, обработкой видео и прочим.
из fastapi импортировать FastAPI
из fastapi.responses импортировать StreamingResponse
some_file_path = "большой видеофайл.mp4"
приложение = FastAPI()
@приложение.получить("/")
деф основной():
def iterfile(): # (1)
с open(some_file_path, mode="rb") как file_like: # (2)
выход из file_like # (3)
вернуть StreamingResponse(iterfile(), media_type="video/mp4")
- Это функция генератора. Это «функция-генератор», потому что она содержит
операторов yieldвнутри. - Используя блок
с, мы гарантируем, что файлоподобный объект будет закрыт после выполнения функции генератора. Итак, после того, как он закончит отправку ответа. Этот выход
изговорит функции перебирать эту вещь с именемfile_like. А затем для каждой повторяемой части выведите эту часть как полученную из этой функции генератора.Таким образом, это функция-генератор, которая передает «генерирующую» работу чему-то другому внутри.

Сделав это таким образом, мы можем поместить его в блок
си таким образом гарантировать, что он будет закрыт после завершения.
Совет
Обратите внимание, что здесь, поскольку мы используем стандартный open() , который не поддерживает async и await , мы объявляем операцию пути с обычным def .
Ответ файла Асинхронно передает файл в качестве ответа.
Принимает другой набор аргументов для создания экземпляра, чем другие типы ответов:
-
путь— путь к файлу для потоковой передачи. -
заголовки— Любые пользовательские заголовки для включения в виде словаря. -
media_type— Строка, указывающая тип носителя. Если не установлено, имя файла или путь будут использоваться для определения типа носителя. -
имя файла— Если установлено, это будет включено в ответContent-Disposition.
Файловые ответы будут включать соответствующие заголовки Content-Length , Last-Modified и ETag .
из fastapi импортировать FastAPI
из fastapi.responses импортировать FileResponse
some_file_path = "большой видеофайл.mp4"
приложение = FastAPI()
@приложение.получить("/")
асинхронная функция main():
вернуть FileResponse (some_file_path)
Вы также можете использовать response_class параметр:
из fastapi импортировать FastAPI
из fastapi.responses импортировать FileResponse
some_file_path = "большой видеофайл.mp4"
приложение = FastAPI()
@app.get("/", response_class=FileResponse)
асинхронная функция main():
вернуть путь к некоторому_файлу
В этом случае вы можете вернуть путь к файлу непосредственно из вашей операции пути.
Пользовательский класс ответов
Вы можете создать свой собственный класс ответа, наследующий от Response и использующий его.
Допустим, вы хотите использовать или json , но с некоторыми пользовательскими настройками, не используемыми во включенном классе ORJSONResponse .
Допустим, вы хотите, чтобы он возвращал JSON с отступом и форматированием, поэтому вы хотите использовать параметр orjson orjson.OPT_INDENT_2 .
Вы можете создать CustomORJSONResponse . Главное, что вам нужно сделать, это создать метод Response.render(content) , который возвращает содержимое как байт :
при вводе импорта Любой
импортировать оржсон
из fastapi импортировать FastAPI, ответ
приложение = FastAPI()
класс CustomORJSONResponse (ответ):
media_type = "приложение/json"
def render(self, content: Any) -> bytes:
утверждать, что orjson не None, «orjson должен быть установлен»
вернуть orjson.dumps(содержимое, option=orjson.OPT_INDENT_2)
@app.get("/", response_class=CustomORJSONResponse)
асинхронная функция main():
return {"сообщение": "Привет, мир"}
Теперь вместо возврата:
{"сообщение": "Привет, мир"}
.

(Добавлено в версии 0.24.0)

status

Заголовок>
<Тело>
Здесь вам придется использовать мыло.
Тело>
шампунь>
"""
вернуть ответ (содержание = данные, media_type = "приложение/xml")
tiangolo.com")
helpmanual.io/"

