FastHTML快速入门: Cookies,Sessions,提示,认证和授权
Cookies
我们可以使用cookie()
函数设置Cookie。在这个例子中,我们将创建一个timestamp
Cookie。
from datetime import datetime
from IPython.display import HTML
@rt("/settimestamp")
def get(req):now = datetime.now()return P(f'设置为 {now}'), cookie('now', now)
HTML(client.get('/settimestamp').text)
输出:
<!doctype html>
<html><head><title>FastHTML页面</title> </head><body><p>设置为 2024-09-26 15:33:48.141869</p></body>
</html>
现在让我们使用与Cookie名称相同的参数名来获取它。
@rt('/gettimestamp')
def get(now:parsed_date): return f'Cookie设置时间为 {now.time()}'
client.get('/gettimestamp').text
输出:
Cookie设置时间为 15:33:48.141903
Sessions
为了方便和安全起见,FastHTML有一种机制可以在用户的浏览器中存储少量数据。我们可以通过在路由中添加一个session
参数来实现。FastHTML会话是Python字典,我们可以充分利用这一点。下面的例子展示了如何简洁地设置和获取会话。
@rt('/adder/{num}')
def get(session, num: int):session.setdefault('sum', 0)session['sum'] = session.get('sum') + numreturn Response(f'总和是 {session["sum"]}.')
提示(也称为消息)
提示,有时也称为“消息”,是用于通知用户某些事情已经发生的小通知。提示可以有四种类型:
- 信息
- 成功
- 警告
- 错误
提示示例可能包括: - “支付已接受”
- “数据已提交”
- “请求已批准”
提示需要使用setup_toasts()
函数,并且每个视图都需要以下两个功能: - 会话参数
- 必须返回FT或FtResponse组件
setup_toasts(app)
@rt('/toasting')
def get(session):# 通常一个提示就足够了,这使我们能够看到不同提示类型的实际效果。add_toast(session, f"提示正在烹饪", "info")add_toast(session, f"提示准备好了", "success")add_toast(session, f"提示变得有点脆", "warning")add_toast(session, f"提示烧焦了!", "error")return Titled("我喜欢提示")
第1行:setup_toasts
是一个辅助函数,它添加了提示依赖。通常,这会在fast_app()
之后立即声明。
第4行:提示需要会话。
第11行:具有提示的视图必须返回FT或FtResponse组件。
认证和授权
在FastHTML中,认证和授权的任务是通过Beforeware处理的。Beforeware是在路由处理程序被调用之前运行的函数。它们适用于全局任务,例如确保用户已认证或具有访问视图的权限。
首先,我们编写一个接受请求和会话参数的函数:
# 状态码303是一个重定向,可以将POST重定向为GET,
# 因此它适合登录页面。
login_redir = RedirectResponse('/login', status_code=303)
def user_auth_before(req, sess):# `auth`键在请求作用域中自动提供# 任何请求它的地方都可以使用,不能被用户通过查询参数、Cookie等注入,# 所以应该安全地使用。 auth = req.scope['auth'] = sess.get('auth', None)# 如果会话键不存在,则重定向到登录页面。if not auth: return login_redir
现在,我们将我们的user_auth_before
函数作为第一个参数传递给
Beforeware
类。我们还向skip
参数传递了一个正则表达式列表,用于允许用户仍然可以访问主页和登录页面。
beforeware = Beforeware(user_auth_before,skip=[r'/favicon\.ico', r'/static/.*', r'.*\.css', r'.*\.js', '/login', '/']
)
app, rt = fast_app(before=beforeware)