Flask
Flask python web微框架,微框架不意味着Flask在功能上有所欠缺,微框架的“微”意味着Flask旨在保持核心简单而易于扩展,Flask不会为我们做出太多决策,所以这里的一切都是由自己掌控。
Flask安装使用
Flask的安装在PYPI源中就已经存在,所以我们可以使用pip安装,如果需要安装最新版本的Flask可以下载github的版本:http://github.com/mitsuhiko/flask.git
1 | ~]# pip install -U flask |
最小的Flask应用:
1 | from flask import Flask |
2 | app=Flask(__name__) |
3 |
|
4 | @app.route('/') |
5 | def index(): |
6 | return 'hello flask' |
7 | if __name__ == '__main__': |
8 | app.run(host=0.0.0.0,debug=True) |
- 首先,导入Flask类,这个类的实例是WSGI应用程序。
- 接下来创建一个该类的实例,第一个参数是应用模块或者包的名称。
- 然后,使用route()装饰器告诉Flask什么样的URL触发什么样的函数。
- 这个函数的名称也在生成URL时被特定的函数采用,这个函数返回我们想要显示在用户浏览器中的信息。
- 最后我们用run()函数来让应用运行在本地服务器上。
注意:调试模式在生产环境绝对不可开启,调试模式将可以执行任意代码。
站点路由
我们知道route()装饰器把一个函数绑定到对应的URL上。
1 | @app.route('/index') |
2 | def index(): |
3 | return 'Index Page' |
URL变量添加,url上的命名参数传递到你的函数,这个变量支持三种:(1)int(2)float(3)path
1 | @app.route('/student/<name>') |
2 | def show_name(name): |
3 | return 'student {}'.format(name) |
4 |
|
5 | @app.route('/grade/<int:score>') |
6 | def show_score(score): |
7 | return 'score {}'.format(score) |
8 |
|
9 | @app.route('/high/<float:hig>') |
10 | def show_high(hig): |
11 | return 'high {}'.format(hig) |
注意:
1 | @app.route('/about/') #访问/about将会重定向/about/,这个url会被匹配 |
2 | def index(): |
3 | return "about page" |
4 |
|
5 | @app.route('/about') #访问/about将会重定向/about/,这个url不会被匹配,404 |
6 | def index(): |
7 | return 'about page' |
构造URL
1 | from flask import Flask,url_for |
2 | app=Flask(__name__) |
3 |
|
4 | @app.route('/') |
5 | def index():pass |
6 | @app.route('/login') |
7 | def login():pass |
8 | @app.route('/user/<username>') |
9 | def profile(username):pass |
10 |
|
11 | with app.test_request_context(): |
12 | print(url_for('index')) |
13 | print(url_for('login')) |
14 | print(url_for('login',user='js') |
15 | print(url_for('profile',username='zhang jusene')) |
1 | ~]# python view.py |
2 | / |
3 | /login |
4 | /login?user=js |
5 | /user/zhang%20jusene |
HTTP方法
默认情况下路由只回应GET请求,但是route()装饰器可以改变methods参数可以改变这个行为。
1 | @app.route('/login',methods=['GET','POST']) |
2 | def login(): |
3 | if request.method == 'POST': |
4 | do_auth() |
5 | else: |
6 | do_redirect() |
静态文件
Flask框架默认为我们设置了一些默认值,从上面我么可以知道url_for的对象是函数,而Flask为了可以获得静态文件,默认构造了static这个函数,如我们想要访问static/main.css:
1 | url_for('static',filename='main.css') #构造出静态资源url |
模版渲染
Flask配备了jinja2模版引擎,可以使用render_template()方法来渲染,而这个template默认在同级的templates的目录下。
1 | from flask import Flask,render_template |
2 | app=Flask(__name__) |
3 | @app.route('/hello/<name>') |
4 | def hello(name=None): |
5 | return render_template('hello.html',name=name) |
1 | ~]# cat templates/hello.html |
2 | <!doctype html> |
3 | <title>Hello Flask</title> |
4 | {% if name %} |
5 | <h1>Hello {{name}}</h1> |
6 | {% else %} |
7 | <h1>Hello World</h1> |
8 | {% endif %} |
请求对象
1 | from flask import Flask,request |
2 | app=Flask(__name__) |
3 | @app.route('/',methods=['GET','POST']) |
4 | username=request.args.get('username') |
5 | password=request.form['password'] |
重定向和错误
1 | from flask import Flask,abort,redirect,url_for |
2 | app=Flask(__name__) |
3 | @app.route('/') |
4 | def index(): |
5 | return redirect(url_for('login')) |
6 |
|
7 | @app.route('/login') |
8 | def login(): |
9 | abort(401) |
定制错误页面
1 | from flask import Flask,render_template |
2 | app=Flask(__name__) |
3 |
|
4 | @app.errorhandler(404) |
5 | def page_not_found(error): |
6 | return render_template('page_not_found.html'),404 |
响应
1 | from flask import Flask,make_responce |
2 | app=Flask(__name__) |
3 |
|
4 | @app.errorhandler(404) |
5 | def not_found(error): |
6 | resp = make_response(render_template('error.html'), 404) |
7 | resp.headers['X-Something'] = 'A value' |
8 | return resp |
cookie
存储cookie
1 | from flask import make_response |
2 |
|
3 | @app.route('/') |
4 | def index(): |
5 | resp = make_response(render_template(...)) |
6 | resp.set_cookie('username', 'the username') |
7 | return resp |
读取cookie
1 | from flask import request |
2 |
|
3 | @app.route('/') |
4 | def index(): |
5 | username = request.cookies.get('username') |
session
session允许在不同的请求间存储特定用户的信息,基于cookie实现,并且对于cookie进行了密钥签名。
1 | from flask import Flask,session,redirect,url_for,escape,request |
2 |
|
3 | app=Flask(__name__) |
4 | app.secret_key='1qazxsw2' |
5 | @app.route('/') |
6 | def index(): |
7 | if 'username' in session: |
8 | return 'Logged in as %s' % escape(session['username']) |
9 | return 'You are not logged in' |
10 | @app.route('/login',methods=['GET','POST']) |
11 | def login(): |
12 | if request.method == 'POST': |
13 | session['username'] = request.form['username'] |
14 | return redirect(url_for('index')) |
15 | return ''' |
16 | <form action="http://127.0.0.1:5000/login" method="post"> |
17 | <p><input type=text name=username> |
18 | <p><input type=submit value=Login> |
19 | </form> |
20 | ''' |
21 | @app.route('/loginout') |
22 | def loginout(): |
23 | session.pop('username',None) |
24 | return redirect(url_for('index')) |
log
从Flask 0.3 开始,Flask 就已经预置了日志系统。
1 | app.logger.debug('A vlaue for debug') |
2 | app.logger.error('An error occurred') |
具体的配置需要参考logging库。