Python Flask Web框架(六)
来源:互联网 发布:pb数据窗口列标题修改 编辑:程序博客网 时间:2024/05/29 04:46
一、重定向和错误
你能够用redirect()
函数重定向用户到其它地方。能够用abort()
函数提前中断一个请求并带有一个错误代码。
下面是一个演示它们如何工作的例子:
from flask import abort, redirect, url_for@app.route('/')def index(): return redirect(url_for('login'))@app.route('/login')def login(): abort(401) this_is_never_executed()
这是一个相当无意义的例子因为用户会从主页/
重定向到一个不能访问的页面/login
( 401 意味着禁止访问),但是它说明了重定向如何工作。
默认情况下,每个错误代码会显示一个黑白错误页面。如果你想定制错误页面,可以使用errorhandler()
装饰器:
from flask import render_template@app.errorhandler(404)def page_not_found(error): return render_template('page_not_found.html'), 404
注意到 404 是在render_template()
调用之后。告诉 Flask 该页的错误代码应是 404 ,即没有找到。默认的 200 被假定为:一切正常。
二、关于响应
一个视图函数的返回值会被自动转换为一个响应对象。如果返回值是一个字符串,它被转换成一个响应主体是该字符串,错误代码为 200 OK
,媒体类型为text/html
的响应对象。 Flask 把返回值转换成响应对象的逻辑如下:
- 如果返回的是一个合法的响应对象,它会被从视图直接返回。
- 如果返回的是一个字符串,响应对象会用字符串数据和默认参数创建。
- 如果返回的是一个元组而且元组中元素能够提供额外的信息。这样的元组必须是(
response, status, headers
) 形式且至少含有其中的一个元素。status
值将会覆盖状态代码,headers
可以是一个列表或额外的消息头值字典。 - 如果上述条件均不满足,Flask 会假设返回值是一个合法的 WSGI 应用程序,并转换为一个请求对象。
如果你想要获取在视图中得到的响应对象,你可以用函数make_response()
。
想象你有这样一个视图:
@app.errorhandler(404)def not_found(error): return render_template('error.html'), 404
你只需要用make_response()
封装返回表达式,获取结果对象并修改,然后返回它:
@app.errorhandler(404)def not_found(error): resp = make_response(render_template('error.html'), 404) resp.headers['X-Something'] = 'A value' return resp
三、会话
除了请求对象,还有第二个称为session
对象允许你在不同请求间存储特定用户的信息。 这是在 cookies 的基础上实现的,并且在 cookies 中使用加密的签名。这意味着用户可以查看 cookie 的内容, 但是不能修改它,除非它知道签名的密钥。
要使用会话,你需要设置一个密钥。这里介绍会话如何工作:
from flask import Flask, session, redirect, url_for, escape, requestapp = Flask(__name__)@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=['GET', 'POST'])def login(): if request.method == 'POST': session['username'] = request.form['username'] return redirect(url_for('index')) return ''' <form action="" method="post"> <p><input type=text name=username> <p><input type=submit value=Login> </form> '''@app.route('/logout')def logout(): # 如果用户名存在,则从会话中移除该用户名 session.pop('username', None) return redirect(url_for('index'))# 设置密钥,保证会话安全app.secret_key = 'wing1995 is a very good girl'
这里提到的escape()
可以在你不使用模板引擎的时候做转义(如同本例)。其中,login
函数中返回的网页源代码可以单独存储在templates
文件夹中作为模板文件html
,然后使用return render_template()
更方便。
怎样产生一个好的密钥:
随机的问题在于很难判断什么是真随机。一个密钥应该足够随机。你的操作系统可以基于一个密码随机生成器来生成漂亮的随机值,这个值可以用来做密钥:
>>> import os>>> os.urandom(24)'\xfd{H\xe5<\x95\xf9\xe3\x96.5\xd1\x01O<!\xd5\xa2\xa0\x9fR"\xa1\xa8'
把这个值复制粘贴到你的代码,你就搞定了密钥,当然你也可以跟我一样设置一些有趣的句子~
使用基于 cookie 的会话需注意: Flask 会将你放进会话对象的值序列化到 cookie 。如果你试图寻找一个跨请求不能存留的值, cookies 确实是启用的,并且你不会获得明确的错误信息,检查你页面请求中 cookie 的大小,并与 web 浏览器所支持的大小对比。
效果截图:
四、消息闪烁
好的应用和用户界面全部是关于反馈。如果用户得不到足够的反馈,他们可能会变得讨厌这个应用。Flask 提供了一个真正的简单的方式来通过消息闪现系统给用户反馈。消息闪现系统基本上使得在请求结束时记录信息并在下一个 (且仅在下一个)请求中访问。通常结合模板布局来显示消息。
使用flash()
方法来闪现一个消息,使用get_flashed_messages()
能够获取消息,get_flashed_messages()
也能用于模版中。针对一个完整的例子请查阅消息闪现。
五、日志
在 Flask 0.3中新增的功能
有时候你会处于一种你处理的数据应该是正确的,然而实际上并不正确的状况。比如你可能有一些客户端代码,代码向服务器发送一个 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')
附带的 logger 是一个标准的日志类 Logger ,因此更多的信息请 查阅官方文档 logging documentation。
六、整合 WSGI 中间件
如果你想给你的应用添加 WSGI 中间件,你可以封装内部 WSGI 应用。例如如果你想使用 Werkzeug 包中的某个中间件来应付 lighttpd 中的 bugs,你可以这样做:
from werkzeug.contrib.fixers import LighttpdCGIRootFixapp.wsgi_app = LighttpdCGIRootFix(app.wsgi_app)
七、小结
本节讲了 flask 的重地向、响应、会话和扩展,重定向可以使用redirect()
,错误处理可以使用errorhander
装饰器,session
对象保存会话的信息,要使用会话需要设置secret_key
,可以用make_response
函数生成响应,flash
可以用于消息闪现,flask 也能够整合WSGI中间件。
八、练习
请完整的实现一个用户登录的功能,如果用户名和密码都为shiyanlou
,那么就把数据放到session
中,并显示Hello shiyanlou
,如果用户名和密码不对,那么就重定向到一个页面显示用户名和密码错误。
- Python Flask Web框架(六)
- Python Flask Web框架(一)
- Python Flask Web框架(二)
- Python Flask Web框架(三)
- Python Flask Web框架(四)
- Python Flask Web框架(五)
- Python Flask Web框架(七)
- Python Flask Web框架(八)
- Python Flask Web框架(九)
- Python Web框架之Flask(1)
- 吐槽 Python Web 框架 Flask
- Python flask web框架学习
- Python明星web框架Flask
- Python基础-Web框架-Flask
- python Web开发 flask轻量级Web框架
- 【001】基于Python的Flask Web应用框架(1)
- 【002】基于Python的Flask Web应用框架(2)
- python - web框架 - Flask 参考内容
- OpenGLES2.0 概念
- 微信小程序switch图标垂直居中
- JDK中IO包的源码解读配合大神的一起看,秒懂。
- 高通无线接收流程
- tortoisegit使用密钥连接服务器
- Python Flask Web框架(六)
- Java网络爬虫--HtmlParser应用
- APP实用开发——SplashScreen页面倒计时跳转
- 5.1面向对象<封装>(函数,类和对象)
- javaScript变量提升?
- ORA-00913: too many values 错误分析
- dlib::array2d<unsigned char> 与 cv::Mat 互转
- 时间序列分析(3)Python-最简单的回归
- C++对象内存布局-多重继承