08.23 Flask Web视图函数中处理表单与刷新问题

Flask Web视图函数中处理表单与刷新问题

上篇说了表单的事,增加了表单后,视图函数就从原来的渲染html,变为了既要渲染表单,又要接收表单数据。此时app.route修饰器methods应该添加GET 和 POST方法,将视图函数注册为GET 和 POST请求的处理函数。

其实,之前应该也有提到,app.route修饰器默认是GET方法的,即只把程序注册为了GET请求的处理函数。这里把POST方法添加上是很有必要的,因为将提交表单作为POST请求进行处理更加便利。虽然,表单也可以作为GET请求提交,但是GET请求没有主体,提交的数据是以查询字符串的形式附加到URL中的,就是说,可以在浏览器的地址栏看到提交的信息。对于一些私密信息,这种方式无疑是不安全的,例如提交的是登录名与登录密码。使用POST表单就会好很多。

那么,通常视图函数是如何处理的呢?以提交账户和密码的表单为例,用户第一次访问程序时,服务器收到一个没有表单数据的GET请求(处理表单的视图函数通常会有一个验证函数,验证提交的数据是否合法),由于没有表单数据,验证函数将会现实验证失败,一般情况下,视图函数会渲染一个空白表单,返回给用户浏览器,让用户重新输入表单信息。当用户输入正确信息提交后,服务器会收到一个包含数据的POST请求,验证函数验证过后,将会进行正确的渲染页面并返回。

Flask Web视图函数中处理表单与刷新问题

视图函数增加了处理表单的功能,仍然存在可用性问题,就是当正确提交信息后,刷新浏览器,会有警告,要求再次提交表单之前进行确认。这个问题的原因是刷新页面时浏览器会重新发送之前已经发送过的最后一个请求,如果这个请求时POST表单数据的,那么会自动再次提交表单。

所以最好别让Web程序把POST请求作为浏览器发送的最后一个请求。如何实现?使用重定向作为POST请求的响应即可。重定向之前也提到过,有专门的重定向函数,不过这里再补充一下,重定向作为一种特殊的响应,响应的内容不是通常的HTML字符串,而是URL。当浏览器收到这种响应时,会向重定向的URL发起GET请求,这样就解决了POST请求作为浏览器发送的最后一个请求带来的问题。这个技巧称为 POST/重定向/GET模式

Flask Web视图函数中处理表单与刷新问题

刷新问题解决了,但是也带来了新的问题,试想,当程序处理POST请求时,会获取表单的信息,可是一旦这个请求结束,数据就丢失了,所以程序需要保存表单中输入的信息,这样重定向后的请求才能获得并使用这个名字,从而构建真正的响应。现实处理中,程序可以把数据存储在用户会话中,就是通常所看到的session。这个session是请求上下文中的变量,是一种私有存储,存在于每个连接到服务器的客户端中。默认下,用户会话保存在客户端的cookie中,使用设置的SECRET_KEY进行加密签名。如果篡改了cookie中的内容,签名就会失效,会话也随之失效。

使用请求上下文后,刷新问题得以真正解决。最后提一下,请求完成后,当用户想知道状态变化,可以使用flash消息,将状态如确认,警告,或错误通知用户。

今天到此为止,待续未完。。。


分享到:


相關文章: