Response

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 (

application/json ), как в случае с JSONResponse и UJSONResponse , возвращаемые вами данные будут автоматически преобразованы (и отфильтрованы) с помощью любого Pydantic response_model , который вы объявили в декораторе операции пути .

Примечание

Если вы используете класс ответа без типа носителя, FastAPI будет ожидать, что ваш ответ не будет содержать содержимого, поэтому он не будет документировать формат ответа в созданных документах OpenAPI.

Использовать

ORJSONResponse

Например, если вы сжимаете производительность, вы можете установить и использовать или json

и задать ответ как ORJSONResponse .

Импортируйте класс (подкласс) Response , который вы хотите использовать, и объявите его в декоратор операции пути .

Для больших ответов возврат ответа Response напрямую намного быстрее, чем возврат словаря.

Это связано с тем, что по умолчанию FastAPI проверяет каждый элемент внутри и проверяет его сериализуемость с помощью JSON, используя тот же кодировщик, совместимый с JSON, который описан в руководстве. Именно это позволяет возвращать произвольных объектов , ​​например модели базы данных.

Но если вы уверены, что возвращаете контент сериализуем с помощью JSON

, вы можете передать его непосредственно в класс ответа и избежать дополнительных накладных расходов, которые возникнут у FastAPI, передав возвращаемый контент через 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 с

text/html :

Доступные ответы

Вот некоторые из доступных ответов.

Имейте в виду, что вы можете использовать Response для возврата чего-либо еще или даже для создания собственного подкласса.

Технические детали

Вы также можете использовать из starlette.responses import HTMLResponse .

FastAPI предоставляет те же starlette.responses as fastapi.responses просто для удобства разработчика. Но большинство доступных ответов исходит непосредственно от Старлетт.

Ответ

Основной класс Response , все остальные ответы наследуются от него.

Вы можете вернуть его напрямую.

Принимает следующие параметры:

  • содержимое — A стр или байт .
  • status_code — код состояния HTTP int .
  • заголовков dict строк.
  • media_type — A str , указывающая тип носителя. Например. "текст/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")
 
  1. Это функция генератора. Это «функция-генератор», потому что она содержит операторов yield внутри.
  2. Используя блок с , мы гарантируем, что файлоподобный объект будет закрыт после выполнения функции генератора. Итак, после того, как он закончит отправку ответа.
  3. Этот выход из говорит функции перебирать эту вещь с именем 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 {"сообщение": "Привет, мир"}
 

Теперь вместо возврата:

 {"сообщение": "Привет, мир"}
 

.