首页 » Python » flask 重定向和会话

flask 重定向和会话

 

用户输入名字后提交表单,然后点击浏览器的刷新按钮,会看到一个莫名其妙的警告,要求在再次提交表单之前进行确认。之所以出现这种情况,是因为刷新页面时浏览器会重新发送之前已经发送过的最后一个请求。如果这个请求是一个包含表单数据的POST 请求,刷新页面后会再次提交表单。大多数情况下,这并不是理想的处理方式。很多用户都不理解浏览器发出的这个警告。 基于这个原因,最好别让Web 程序把 POST 请求作为浏览器发送的最后一个请求。
这种需求的实现方式是, 使用重定向作为POST 请求的响应,而不是使用常规响应。重定向是一种特殊的响应, 响应内容是URL,而不是包含HTML 代码的字符串。浏览器收到这种响应时, 会向重定向的URL 发起 GET 请求,显示页面的内容。这个页面的加载可能要多花几微秒, 因为要先把第二个请求发给服务器。除此之外,用户不会察觉到有什么不同。现在,最后一个请求是GET 请求,所以刷新命令能像预期的那样正常使用了。这个技巧称为Post/ 重定向 /Get 模式。
但这种方法会带来另一个问题。 程序处理POST 请求时,使用 form.name.data 获取用户输获取用户输入的名字
可是一旦这个请求结束,数据也就丢失了。因为这个 POST 请求使用重定向处理,所以程序需要保存输入的名字, 这样重定向后的请求才能获得并使用这个名字,从而构建真正的响应。
程序可以把数据存储在用户会话中,在请求之间“ 记住”数据。用户会话是一种私有存储,存在于每个连接到服务器的客户端中。用户会话,它是请求上下文中的变量,名为session,像标准的Python 字典一样操作。

修改 hello.py: 重定向和用户会话

局部变量name 被用于存储用户在表单中输入的名字。这个变量现在保存在用户会话中,即session['name'],所以在两次请求之间也能记住输入的值。现在,包含合法表单数据的请求最后会调用redirect() 函数。 redirect() 是个辅助函数,用来生成HTTP 重定向响应。 redirect() 函数的参数是重定向的 URL,这里使用的重定向URL是程序的根地址, 因此重定向响应本可以写得更简单一些,写成 redirect('/'),但却会使用Flask 提供的 URL 生成函数 url_for()。推荐使用url_for() 生成 URL,因为这个函数使用URL 映射生成 URL,从而保证URL 和定义的路由兼容,而且修改路由名字后依然可用。url_for()函数的第一个且唯一必须指定的参数是端点名,即路由的内部名字。 默认情况下,路由的端点是相应视图函数的名字。在这个示例中,处理根地址的视图函数是index(),因此传给url_for() 函数的名字是 index。

  1. 最后一处改动位于render_function() 函数中,使用 session.get('name') 直接从会话中读取name 参数的值。和普通的字典一样,这里使用 get() 获取字典中键对应的值以避免未找到键的异常情况,因为对于不存在的键,get() 会返回默认值 None。
    此时刷新浏览器页面,你看到的新页面就和预期一样了。

 

唯一 URL / 重定向行为

Flask 的 URL 规则基于 Werkzeug 的路由模块。这个模块背后的思想是基于 Apache 以及更早的 HTTP 服务器主张的先例,保证优雅且唯一的 URL。

以这两个规则为例:

虽然它们看起来着实相似,但它们结尾斜线的使用在 URL 定义 中不同。第一种情况中,指向projects 的规范 URL 尾端有一个斜线。这种感觉很像在文件系统中的文件夹。访问一个结尾不带斜线的 URL 会被Flask 重定向到带斜线的规范 URL 去。

然而,第二种情况的 URL 结尾不带斜线,类似 UNIX-like 系统下的文件的路径名。访问结尾带斜线的 URL 会产生一个 404 “Not Found” 错误。

这个行为使得在遗忘尾斜线时,允许关联的 URL 接任工作,与 Apache 和其它的服务器的行为并无二异。此外,也保证了 URL 的唯一,有助于避免搜索引擎索引同一个页面两次。

原文链接:flask 重定向和会话,转载请注明来源!

0