from fasthtml.common import *响应类型
FastHTML 提供了多种 HTTP 响应类型,它们会自动设置相应的 HTTP 内容类型并处理序列化。主要的响应类型有:
- FT 组件
- 重定向(HTTP 303 及其他 3xx 代码)
- JSON(用于 API 端点)
- 流(EventStream,用于服务器端事件)
- 纯文本
Websocket 有自己的协议,不遵循 HTTP 请求/响应周期。要了解更多信息,请在此处查看我们关于 Websocket 的解释。
配置
app,rt = fast_app()app 和 rt 是常见的 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 包装。