mirror of https://github.com/encode/starlette.git
158 lines
4.0 KiB
Markdown
158 lines
4.0 KiB
Markdown
|
|
||
|
Starlette includes a few response classes that handle sending back the
|
||
|
appropriate ASGI messages on the `send` channel.
|
||
|
|
||
|
### Response
|
||
|
|
||
|
Signature: `Response(content, status_code=200, headers=None, media_type=None)`
|
||
|
|
||
|
* `content` - A string or bytestring.
|
||
|
* `status_code` - An integer HTTP status code.
|
||
|
* `headers` - A dictionary of strings.
|
||
|
* `media_type` - A string giving the media type. eg. "text/html"
|
||
|
|
||
|
Starlette will automatically include a Content-Length header. It will also
|
||
|
include a Content-Type header, based on the media_type and appending a charset
|
||
|
for text types.
|
||
|
|
||
|
Once you've instantiated a response, you can send it by calling it as an
|
||
|
ASGI application instance.
|
||
|
|
||
|
```python
|
||
|
class App:
|
||
|
def __init__(self, scope):
|
||
|
self.scope = scope
|
||
|
|
||
|
async def __call__(self, receive, send):
|
||
|
response = Response('Hello, world!', media_type='text/plain')
|
||
|
await response(receive, send)
|
||
|
```
|
||
|
|
||
|
### HTMLResponse
|
||
|
|
||
|
Takes some text or bytes and returns an HTML response.
|
||
|
|
||
|
```python
|
||
|
from starlette import HTMLResponse
|
||
|
|
||
|
|
||
|
class App:
|
||
|
def __init__(self, scope):
|
||
|
self.scope = scope
|
||
|
|
||
|
async def __call__(self, receive, send):
|
||
|
response = HTMLResponse('<html><body><h1>Hello, world!</h1></body></html>')
|
||
|
await response(receive, send)
|
||
|
```
|
||
|
|
||
|
### PlainTextResponse
|
||
|
|
||
|
Takes some text or bytes and returns an plain text response.
|
||
|
|
||
|
```python
|
||
|
from starlette import PlainTextResponse
|
||
|
|
||
|
|
||
|
class App:
|
||
|
def __init__(self, scope):
|
||
|
self.scope = scope
|
||
|
|
||
|
async def __call__(self, receive, send):
|
||
|
response = PlainTextResponse('Hello, world!')
|
||
|
await response(receive, send)
|
||
|
```
|
||
|
|
||
|
### JSONResponse
|
||
|
|
||
|
Takes some data and returns an `application/json` encoded response.
|
||
|
|
||
|
```python
|
||
|
from starlette import JSONResponse
|
||
|
|
||
|
|
||
|
class App:
|
||
|
def __init__(self, scope):
|
||
|
self.scope = scope
|
||
|
|
||
|
async def __call__(self, receive, send):
|
||
|
response = JSONResponse({'hello': 'world'})
|
||
|
await response(receive, send)
|
||
|
```
|
||
|
|
||
|
### RedirectResponse
|
||
|
|
||
|
Returns an HTTP redirect. Uses a 302 status code by default.
|
||
|
|
||
|
```python
|
||
|
from starlette import PlainTextResponse, RedirectResponse
|
||
|
|
||
|
|
||
|
class App:
|
||
|
def __init__(self, scope):
|
||
|
self.scope = scope
|
||
|
|
||
|
async def __call__(self, receive, send):
|
||
|
if self.scope['path'] != '/':
|
||
|
response = RedirectResponse(url='/')
|
||
|
else:
|
||
|
response = PlainTextResponse('Hello, world!')
|
||
|
await response(receive, send)
|
||
|
```
|
||
|
|
||
|
### StreamingResponse
|
||
|
|
||
|
Takes an async generator and streams the response body.
|
||
|
|
||
|
```python
|
||
|
from starlette import Request, 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
|
||
|
await asyncio.sleep(0.5)
|
||
|
yield('</ul></body></html>')
|
||
|
|
||
|
|
||
|
class App:
|
||
|
def __init__(self, scope):
|
||
|
self.scope = scope
|
||
|
|
||
|
async def __call__(self, receive, send):
|
||
|
generator = slow_numbers(1, 10)
|
||
|
response = StreamingResponse(generator, media_type='text/html')
|
||
|
await response(receive, send)
|
||
|
```
|
||
|
|
||
|
### FileResponse
|
||
|
|
||
|
Asynchronously streams a file as the response.
|
||
|
|
||
|
Takes a different set of arguments to instantiate than the other response types:
|
||
|
|
||
|
* `path` - The filepath to the file to stream.
|
||
|
* `headers` - Any custom headers to include, as a dictionary.
|
||
|
* `media_type` - A string giving the media type. If unset, the filename or path will be used to infer a media type.
|
||
|
* `filename` - If set, this will be included in the response `Content-Disposition`.
|
||
|
|
||
|
File responses will include appropriate `Content-Length`, `Last-Modified` and `ETag` headers.
|
||
|
|
||
|
```python
|
||
|
from starlette import FileResponse
|
||
|
|
||
|
|
||
|
class App:
|
||
|
def __init__(self, scope):
|
||
|
self.scope = scope
|
||
|
|
||
|
async def __call__(self, receive, send):
|
||
|
response = FileResponse('/statics/favicon.ico')
|
||
|
await response(receive, send)
|
||
|
```
|
||
|
|
||
|
|
||
|
<p align="center">— ⭐️ —</p>
|
||
|
<p align="center"><i>Starlette is <a href="https://github.com/tomchristie/starlette/blob/master/LICENSE.md">BSD licensed</a> code. Designed & built in Brighton, England.</i></p>
|