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 {"сообщение": "Привет, мир"}
Теперь вместо возврата:
{"сообщение": "Привет, мир"}
.