Перейти к содержанию

Ответы

Starlette содержит несколько классов ответов для отправки соответствующих сообщений ASGI по каналу send.

Ответить

Подпись: Response(content, status_code=200, headers=None, media_type=None)

  • content - Строка или строка байта.
  • status_code - Целочисленный HTTP-код.
  • headers - Строковые словари.
  • media_type - Строка, указывающая тип носителя. Например,"text/html"

Starlette автоматически содержит заголовок Content-Length. Он также будет содержать заголовок Content-Type в соответствии с media_type и добавляет набор символов к типу текста, если только набор символов не указан в media_type.

После того, как вы создали экземпляр ответа, вы можете отправить его, вызовав его как экземпляр приложения ASGI.

От Starlette. Response import Response


async def app(scope, receive, send):
    assert scope ['type'] ='http'
    Response = Response ('Hello, world!', media_type ='text/plain')
    await response(scope, receive, send)

Starlette предлагает метод set_cookie, который позволяет вам устанавливать файлы Cookie на объектах ответа.

Подпись: Response.set_cookie(key, value, max_age=None, expires=None, path="/", domain=None, secure=False, httponly=False, samesite="lax")

  • key - Строка, которая будет использоваться в качестве ключа Cookie.
  • value - Строка, которая будет служить значением Cookie.
  • max_age - Целое число, определяющее продолжительность жизни файлов Cookie в секундах. Отрицательное целое число или значение 0 Cookies будут немедленно удалены. Optional
  • expires - Это либо целое число, определяющее количество секунд до истечения срока действия Cookie, либо дата и время. Optional
  • path - Строка, указывающая подмножество маршрутов, к которым будет применяться этот файл Cookie. Optional
  • domain - Строка домена, в котором указан действительный файл cookie. Optional
  • secure - Логическое значение, указывающее на то, что файлы Cookie отправляются на сервер только в том случае, если запрос был сделан с использованием протоколов SSL и HTTPS. Optional
  • httponly-Булевое значение, означающее, что доступ к этому файлу Cookie через JavaScript невозможен через свойство Document.cookie,XMLHttpRequest или Request API.Optional
  • samesite-строка политики sameSite, которая определяет файлы cookie. Допустимые значения:'lax','strict' и 'none'. По умолчанию 'lax'.Optional

Вместо этого, Starlette предлагает метод delete_cookie, который вручную делает установленные файлы Cookie устаревшими.

Подпись: Response.delete_cookie(key, path='/', domain=None)

Ответ HTML.

Получает текст или байты и возвращает ответ HTML.

from starlette.responses import HTMLResponse


async def app(scope, receive, send):
    assert scope ['type'] == 'http'
    Response = HTMLResponse('<html><body><h1>Hello, world!</h1></body></html>')
    await response(scope, receive, send)

Прямой текстовый ответ

Получает текст или байты и возвращает обычный текстовый ответ.

from starlette.responses import PlainTextResponse


async def app(scope, receive, send):
    assert scope ['type'] == 'http'
    Response = PlainTextResponse ('Hello, world!')
    await response(scope, receive, send)

JSON ответ

Получите некоторые данные и возвращайте ответ, закодированный application/json.

from starlette. response import JSONResponse


async def app(scope, receive, send):
    assert scope ['type'] == 'http'
    Ответ = JSONResponse({'hello': 'world'})
    await response(scope, receive, send)

Пользовательская сериализация JSON

Если вам нужен тонкий контроль сериализации JSON, вы можете подделать JSONResponse и переписать метод render.

Например, если вы хотите использовать сторонние библиотеки JSON, такие как orjson:

Из импорта импорта

Import orjson
from starlette. response import JSONResponse


class OrjsonResponse(JSONResponse):
    def render(self, content: Any) -> bytes:
        Return orjson.dumps (content)

В целом, если вы не хотите микрооптимизировать определенные конечные точки или не хотите сериализовать нестандартные типы объектов, вы можете придерживаться JSONResponse по умолчанию.

Перенаправление ответа

Возвращает перенаправление HTTP. По умолчанию используется код состояния 307.

from starlette.responses import PlainTextResponse, RedirectResponse


async def app(scope, receive, send):
    assert scope ['type'] ='http'
    Если scope ['path'] != '/':
        Response = RedirectResponse(url ='/')
    else:
        response = PlainTextResponse ('Hello, world!')
    await response(scope, receive, send)

Потоковое реагирование

Примите асинхронный генератор или обычный генератор/итератор и выполняйте потоковую обработку элементов ответа.

От Starlette. Response import StreamingResponse
Import asyncio


async def slow_numbers (minimum, maximum):
    yield '<html><body><ul>'
    for number in range(minimum, maximum + 1):
        yield '<li>%d</li>' % number
        Aquait asyncio sleep(0,5)
    yield '</ul></body></html>'


async def app(scope, receive, send):
    assert scope ['type'] == 'http'
    generator = slow_numbers (1, 10)
    Response = StreamingResponse(generator, media_type ='text/html')
    await response(scope, receive, send)

Обратите внимание, что объекты-файлы классов (такие как объекты, созданные open()) являются обычными итераторами. Таким образом, вы можете вернуть их прямо в StreamingResponse.

Ответы на файлы

Потоковая передача файлов в качестве ответа асинхронным способом.

Экземпляры требуют иного набора параметров по сравнению с другими типами ответов:

  • path - Путь к файлу для потоковой передачи.
  • headers - Любой пользовательский заголовок, который требуется включить в словарь.
  • media_type - Строка, указывающая тип носителя. Если не задано, для определения типа носителя используется имя файла или путь.
  • filename-если он установлен, он будет включен в ответ Content-Disposition.
  • content_disposition_type-будет включен в ответ на Content-Disposition. Можно настроить как "Вложение"(по умолчанию) или "Интранет".

Ответы на файлы будут содержать соответствующие заголовки Content-Length,Last-Modified и ETag.

from starlette.responses import FileResponse


async def app(scope, receive, send):
    assert scope ['type'] ='http'
    response = FileResponse ('statics/favicon.ico')
    await response(scope, receive, send)

Ответы третьих сторон

Ответ источника события

Класс ответов, который реализует события, отправляемые сервером. Он может осуществлять поток событий от сервера к клиенту без сложности WebSockets.

baize.asgi.FileResponse

В качестве плавной альтернативы Starlette FileResponse, он автоматически обрабатывает метод Head и запросы Range.