
3.2 重定向和会话处理
在动态Web程序中的信息交互应用中经常用到URL重定向和用户会话处理功能。在本节的内容中,将详细讲解在Flask Web程序中实现重定向处理和用户会话处理的过程。
3.2.1 Flask中的重定向和会话处理

在Web程序中,重定向是一种特殊的响应,能够响应的是URL中的内容,而不是包含HTML代码的字符串。当浏览器收到重定向响应时,会向重定向的URL发起GET请求并显示网页中的内容。但是需要注意的是,因为在这个过程中需要先把第二个请求发给服务器,所以在加载这个页面时可能需要花费些许时间(可能只有几微秒)。当然对于浏览用户来说,用肉眼是不会发现这个极短时间造成的视觉差异的。
上面介绍的重定向方式被称为POST/重定向/GET模式,但是这种方法会带来一个问题:当在Flask Web程序中处理POST请求时,会使用form.name.data获取用户输入的信息,但是如果这个请求结束,数据也会随之丢失。所以说最好的解决办法是:因为这个POST请求使用重定向处理,所以应设置程序保存用户输入的信息,此时即使重定向请求后延也可以使用这个名字,这样才会构建真正的响应。所以在Flask Web程序中,可以将数据存储在用户会话中,在多次请求处理之间保存数据。
用户会话是一种保存用户数据的存储手段,例如可以使用Session用户会话请求上下文中的变量,就像Python中的字典一样进行操作。其实在默认情况下,在客户端的Cookie中保存用户会话,使用设置的SECRET_KEY加密签名。如果修改了Cookie中的内容,签名和会话也会随之失效。有关Flask的Cookie和Session的知识,已经在本书前面的章节中进行了讲解。
3.2.2 实现重定向和会话处理
在下面的实例中,演示了在Flask Web程序中实现重定向和会话处理的过程。
源码路径:daima\3\3-2\biaodan02\
1)首先编写程序文件biaodan02.py创建一个简单的Web表单,在视图函数index()中实现重定向和用户会话处理。因为已经将登录信息保存在用户会话session['name']中,所以即使在第1行和第2行代码中使用@app.route实现了两次请求处理,在这两次请求之间也可以记住输入的登录信息。文件biaodan02.py的主要实现代码如下所示。

• 函数form.validate_on_submit():验证表单中的数据是否合法。
• 函数redirect():如果验证的表单数据合法,则生成HTTP重定向响应。函数redirect()的参数是重定向的URL,因为在上面代码中使用的重定向URL是程序的根地址'/',所以可以将重定向响应写成redirect('/')。
• 函数render_function():使用session.get('name')从会话中直接读取参数name的值。具体操作方法和普通的字典操作一样,只需使用get()即可获取字典中某个key(键)对应的值。如果要获取的键不存在,get()会返回默认值None。
注意:建议读者使用函数url_for()生成URL,因为url_for()可以保证URL和定义的route路由相互兼容,并且在修改路由名字后继续可用。在上述代码中,因为处理根地址的视图函数是index(),所以传递给函数url_for()的名字是index。
2)模板主页文件index.html的具体实现代码如下所示。

执行后在表单中可以输入信息,例如输入“python大侠”并单击“提交”按钮后的效果如图3-4所示。如果刷新页面,依然会在页面中显示刚刚在表单中输入的“python大侠”。

图3-4 执行效果