响应类型

FastHTML 路由处理程序可用的不同 HTTP 响应类型列表。

FastHTML 提供了多种 HTTP 响应类型,它们会自动设置相应的 HTTP 内容类型并处理序列化。主要的响应类型有:

那 Websocket 呢?

Websocket 有自己的协议,不遵循 HTTP 请求/响应周期。要了解更多信息,请在此处查看我们关于 Websocket 的解释。

配置

from fasthtml.common import *
app,rt = fast_app()

apprt 是常见的 FastHTML 路由处理程序装饰器。我们使用 fast_app 函数来实例化它们。

cli = Client(app)

FastHTML 自带一个名为 Client 的测试客户端。它允许我们通过一个简单的接口来测试处理程序,其中 .get()HTTP GET 请求,.post()HTTP POST 请求。

FT 组件响应

@rt('/ft')
def get(): return Html(Div('FT Component Response'))

这可能是你最熟悉的响应类型。在这里,路由处理程序返回一个 FT 组件,FastHTML 会将其包装在一个带有 head 和 body 的 HTML 文档中。

print(cli.get('/ft').text)
 <!doctype html>
 <html>
   <div>FT Component Response</div>
 </html>

重定向响应

@rt('/rr')
def get(): return Redirect('https://fasthtml.cn/')

在这个路由处理程序中,Redirect 将用户的浏览器重定向到新 URL ‘https://fasthtml.cn/’。

resp = cli.get('/rr')
print(resp.url)
print(resp.status_code)
http://testserver/rr
303

你可以在响应头和 url 属性中看到该 URL,以及状态码 303。

JSON 响应

@rt('/json')
def get(): return {'hello': 'world'}

此路由处理程序返回一个 JSON 响应,其中 content-type 已被设置为 。

resp = cli.get('/json')
print(resp.headers)
print(resp.json())
Headers({'content-length': '17', 'content-type': 'application/json'})
{'hello': 'world'}

你可以看到 Content-Type 响应头已被设置为 application/json,并且响应内容就是 JSON 本身,没有任何 HTML 包装。

事件流 (EventStream)

from time import sleep

def counter():
    """Counter is an generator that
        publishes a number every second.
    """
    for i in range(3):
        yield sse_message(f"Event {i}")
        sleep(1)

@rt('/stream')
def get():
    return EventStream(counter())

通过服务器发送事件(SSE),服务器可以随时向网页发送新数据,即通过向网页推送消息。与 WebSocket 不同,SSE 只能单向传输:从服务器到客户端。此外,SSE 是 HTTP 规范的一部分,而 WebSocket 则使用自己的规范。

resp = cli.get('/stream')
print(resp.text)
event: message
data: Event 0

event: message
data: Event 1

event: message
data: Event 2

上面的每个消息事件都是在前一个消息事件发生一秒后到达的。

纯文本响应

@rt('/text')
def get(): return 'Hello world'

当您从路由处理程序返回一个字符串时,您会得到一个纯文本响应。

print(cli.get('/text').text)
Hello world

在这里你可以看到,响应文本就是你返回的字符串,没有任何 HTML 包装。