Session
除了请求对象之外,还有另一个名为 session 的对象,它允许你存储用户从一个请求到下一个请求的特定信息。这是基于 cookie 之上实现的,并以加密方式对 cookie 进行签名。这意味着用户可以查看 cookie 的内容,但不能修改它,除非他们知道用于签名的密钥。
为了使用会话,必须设置密钥。以下是会话的工作原理:
from flask import session# Set the secret key to some random bytes. Keep this really secret!app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'@app.route('/')def index():if 'username' in session:return f'Logged in as {session["username"]}'return 'You are not logged in'@app.route('/login', methods=['GET', 'POST'])def login():if request.method == 'POST':session['username'] = request.form['username']return redirect(url_for('index'))return '''<form method="post"><p><input type=text name=username><p><input type=submit value=Login></form>'''@app.route('/logout')def logout():# remove the username from the session if it's theresession.pop('username', None)return redirect(url_for('index'))
如何生成好的密钥
密钥应该尽可能随机。你的操作系统可以基于加密随机生成器生成非常随机的数据。使用以下命令快速生成用于 Flask.secret_key (或 SECRET_KEY)的值:
$ python -c 'import secrets; print(secrets.token_hex())'
关于基于 cookie 的会话的注意事项:Flask 将获取输入到会话对象的值,并将它们序列化到 cookie。如果发现一些值在请求之间不存在,cookie 确实已启用,并且没有收到明确的错误消息,请检查页面响应中 cookie 的大小,并与 web 浏览器支持的大小进行比较。
除了默认的基于客户端的会话之外,如果想在服务器端处理会话,有几个 Flask 扩展支持这一点。
信息闪现
好的应用程序和用户界面都需要有良好的反馈。如果用户没有得到足够的反馈,他们可能最终会讨厌这个应用程序。Flask 提供了一种非常简单的方法,可以通过闪现系统向用户提供反馈。闪现系统可以在请求结束时记录消息,并在下一次(且仅在下一次)请求时访问它。通常与布局模板结合使用以展示消息。
要刷新消息,请使用 flash() 方法,要获取消息,可以使用 get_flashed_messages(),模板中也提供了该方法。
记录日志
有时可能会遇到这样的情况:处理的数据应该是正确的,但实际上并非如此。例如,你可能有一些客户端代码向服务器发送HTTP请求,但格式不正确。这可能是由用户篡改数据或客户端代码失败引起的。大多数情况下,此时返回 400 Bad Request 是可以的,但有时不行,代码必须继续工作。
这种情况下需要记录这些可疑的事情,此时就用到了日志系统。从 Flask 0.3 开始,已预先配置好日志记录系统以供使用。
以下是一些日志调用示例:
app.logger.debug('A value for debugging')app.logger.warning('A warning occurred (%d apples)', 42)app.logger.error('An error occurred')
使用 WSGI 中间件
要将 WSGI 中间件添加到 Flask 应用程序,请包装应用程序的 wsgi_app 属性。例如,要将 Werkzeug 的 ProxyFix 中间件应用于运行在 Nginx 背后:
from werkzeug.middleware.proxy_fix import ProxyFixapp.wsgi_app = ProxyFix(app.wsgi_app)
包装 app.wsgi_app 而不是 app,这意味着 app 仍然指向 Flask 应用程序,而不是中间件,所以你可以继续直接使用和配置 app。
使用 Flask 扩展
扩展是帮助完成常见任务的包。例如,Flask-SQLAlchemy 提供了 SQLAlchemy 支持,使其与 Flask 一起使用变得简单和容易。
部署到 Web 服务器
后面有文章单独介绍
原文:
https://flask.palletsprojects.com/en/2.0.x/quickstart/




