Ответы
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)
Настройка файлов Cookie
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 в секундах. Отрицательное целое число или значение0Cookies будут немедленно удалены.Optionalexpires- Это либо целое число, определяющее количество секунд до истечения срока действия Cookie, либо дата и время.Optionalpath- Строка, указывающая подмножество маршрутов, к которым будет применяться этот файл Cookie.Optionaldomain- Строка домена, в котором указан действительный файл cookie.Optionalsecure- Логическое значение, указывающее на то, что файлы Cookie отправляются на сервер только в том случае, если запрос был сделан с использованием протоколов SSL и HTTPS.Optionalhttponly-Булевое значение, означающее, что доступ к этому файлу Cookie через JavaScript невозможен через свойствоDocument.cookie,XMLHttpRequestилиRequestAPI.Optionalsamesite-строка политики sameSite, которая определяет файлы cookie. Допустимые значения:'lax','strict'и'none'. По умолчанию'lax'.Optional
Удалить Cookie
Вместо этого, 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.