Skip to main content

Flask 1.0 快速入手 【四】

Flask 1.0 快速入手 【四】

Flask 1.0 快速入手 【四】

Sessions

除了请求对象之外,还有一个叫做session的第二个对象,它允许您将特定于某个用户的信息从一个请求存储到下一个请求。这是在cookie的基础上实现的,并以加密方式对cookie进行签名。这意味着用户可以查看cookie的内容但不能修改它,除非他们知道用于签名的密钥。

要使用session的话,您必须设置一个密钥。以下是session的工作方式:

from flask import Flask, session, redirect, url_for, escape, request

app = Flask(__name__)

app.secret_key = b'\xbc\xf6\x8aTP\xba\xe7\xf8*\xcc\xa7\xbe\xb2S\xd5\x83'


@app.route('/')
def index():
    if 'username' in session:
        return 'Logged in as %s' % escape(session['username'])

    return 'You are not logged in'


@app.route('/login', methods=['POST', 'GET'])
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>
			<p><input type='submit' value='Login' /></p>
		</form>
	'''


@app.route('/logout')
def logout():
    session.pop('username', None)
    return redirect(url_for('index'))

如果你没有使用模板引擎(如本例所示),这里提到的escape()会为你做转义处理。


如何生成一个好一点的密钥

密钥应尽可能随机。您的操作系统可以基于加密随机生成器生成相当随机的数据。使用以下命令快速生成一个值给Flask.secret_key (或者 SECRET_KEY):

$ python -c 'import os; print(os.urandom(16))'
b'\xbc\xf6\x8aTP\xba\xe7\xf8*\xcc\xa7\xbe\xb2S\xd5\x83'

 


关于基于cookie的会话的说明:Flask将获取您放入session对象的值,并将它们序列化为cookie。如果您发现某些值不会在请求中保留,则确实启用了Cookie,并且您没有收到明确的错误消息,请检查页面响应中的Cookie大小与Web浏览器支持的大小相比较。

除了默认的基于客户端的session,如果你想在服务器端处理session,有几个Flask扩展支持这个。

即时消息

好的应用和用户体验是关于反馈的,如果用户没有得到足够的反馈,他们可能最终会厌恶应用程序,Flask提供了一种使用即时系统向用户提供反馈的简单方法。即时系统基本上可以在请求结束时记录消息,并在下一个(也是下一个)请求中访问它。这通常与布局模板结合使用以显示消息。

要使用flash()方法添加一个即时消息,要获取即时消息,可以使用get_flashed_messages()的方法,这些消息也可以在模板中使用。查看即时消息以获取完整示例。

日志

有时您可能处理的数据应该是正确的,但事实并非如此。例如,您可能有一些客户端代码向服务器发送HTTP请求,但显然格式不正确。这可能是由用户篡改数据或客户端代码失败引起的。在大多数情况下,在这种情况下回复400 Bad Request是可以的,但有时不会这样做,而且代码必须继续工作。

您可能仍想记录发生了可疑的事情。这是loggers派上用场的地方。从Flask 0.3开始,预先配置了一个logger供您使用。

以下是一些日志调用示例:

app.logger.debug('A value for debuging')
app.logger.warning('A warning occurred (%d apples)', 42)
app.logger.error('A error occurred')

附加自带的logger是标准的Logger,因此请访问官方logging文档以获取更多信息。

详细了解应用程序错误

挂钩WSGI中间件

如果要将WSGI中间件添加到应用程序,可以包装内部WSGI应用程序。例如,如果你想使用Werkzeug包中的一个中间件来处理lighttpd中的bug,你可以这样做

from werkzeug.contrib.fixers import LighttpdCGIRootFix
app.wsgi_app = LighttpdCGIRootFix(app.wsgi_app)

使用Flask Extensions

扩展程序是帮助您完成常见任务的程序包。例如,Flask-SQLAlchemy提供SQLAlchemy支持,使其易于与Flask一起使用。

有关Flask扩展的更多信息,请查看扩展

部署到Web服务器

准备部署新的Flask应用了吗?转到“部署选项”。

版权声明

版权声明

张大鹏 创作并维护的 Walkerfree 博客采用 创作共用保留署名-非商业-禁止演绎4.0国际许可证。本文首发于 Walkerfree 博客(http://www.walkerfree.com/),版权所有,侵权必究。本文永久链接:http://www.walkerfree.com/article/150