2.1 初始化

1
2
3
from flask import Flask
app = Flask(__name__)

Flask实例化只有一个必须指定的参数,即程序主模块或包的名字(也即__name__

1
2
3
4
# 2.2 路由和视图函数
1. **路由**:处理URL和函数之间的关系(URL到Python函数的映射关系)的程序。
```可通过Flask实例提供的`app.route()`装饰器把函数注册为路由。

  1. 视图函数:像index()这样的函数。

2.4 一个完整的程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello World!</h1>
@app.route('/user/<name>') # < >尖括号部门是动态url部分
def user(name): # Flask会将动态部分(也即< >部分)作为参数传入视图函数中
return '<h1>Hello {}!'.format(name)
if __name__ == '__main__':
app.run(debug=True)

2.5 请求-响应

2.5.1 程序与请求上下文

  1. 程序上下文
  2. 请求上下文:

2.5.2 请求调度

Flask使用app.route()装饰器或者非装饰器形式的app.add_url_rule()生成URL和视图函数之间的映射

2.5.3 请求钩子

应用场景:在请求开始时,创建数据库链接或认证用户。(即在处理请求之前之后,执行某些代码)
Flask提供以下4种钩子:

  1. before_first_request:注册一个函数,在处理第一个请求之前运行
  2. before_request:注册一个函数,在每次请求之前运行
  3. after_request:注册一个函数,如果没有未处理的异常抛出,在每次请求之后运行
  4. teardown_request:注册一个函数,即使有未处理的异常抛出,也在每次请求之后运行

2.5.4 响应

视图函数返回值可以接受3个参数:响应文本,状态码,一个由header组成的字典。
make_response()函数可以接受3个参数(和视图函数返回值一样),并返回一个response对象,此时我们可以在response对象上调用各种方法,进一步设置响应。
如获得一个response对象,然后设置cookie

1
2
3
4
5
6
7
8
9
10
from flask import Flask
from flask import make_response
app = Flask(__name__)
@app.route('/')
def index():
response = make_response('<h1>This document carries a cookie!</h1>')
response.set_cookie('answer', '42')
return response

redirect()函数用于生成重定向(一种特殊的响应)。

abort函数用于生产另一种特殊响应,用于处理错误。
如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import Flask
from flask import redirect
from flask import abort
app = Flask(__name__)
@app.route('/')
def index():
return redirect('http://www.example.com')
@app.route('/user/<id>')
def get_user(id):
user = load_user(id) # load_user()用于读取id,不展开写
if not user:
abort(404) # 如果id不存在,返回状态吗404
return '<h1>Hello {}</h1>'.format(id)

2.6 Flask扩展

可使用flask-script扩展为Flask程序添加一个命令行解析器,那么就可以自定义很多参数,如监听的host、port等。
实现方式:

1
2
3
4
5
6
7
from flask.ext.script import Manager
# ...
manager = Manager(app)
if __name__ = '__main__':
manager.run()

把Flask实例app作为参数传给Manager(),初始化实例。
注意:Flask扩展都在flask.ext命名空间下,而Python3.5之后都直接使用from flask-xxx import xxx来导入。