<font face="宋体" size=3.5>
# Chapter2 Flask 程序的基本结构
## 一、初始化 Flask
1. 使用`app = Flask(__name__)`创建程序实例
2. name参数决定了程序的根目录
## 二、路由和视图函数
1. **路由**:URL到Python函数的映射关系,Flask程序中定义路由的最简单式,是使用程序实例提供的`app.route`[**修饰器**](http://3ms.huawei.com/hi/group/3144251/thread_6049401.html?mapId=7580363&for_statistic_from=all_group_forum)
2. 修饰器是Python的标准特性,修改函数的行为,常用于把函数注册为事件的处理程序
3. 特定的URL触发服务器执行相应的函数,函数的返回值称为**响应**,该函数称为**视图函数**
4. `@aap.route('/user/<name>')`匹配包含可变部分的URL,尖括号内是动态部分,匹配静态部分的URL都会映射到路由上,动态部分作为参数传入视图函数
## 三、启动服务器
1. `app.run()`启动Web服务器
## 四、完整程序
1. 在地址栏输入`http://127.0.0.1:5000/`,可见视图函数的响应
## 五、请求-响应循环
1. 上下文
a). 为了让视图函数访问请求对象,可将其作为参数传入视图函数,但会增加函数的参数。Flask使用**上下文**临时把某些对象变为全局可访问。
b). Flask让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。
> 避免大量重复参数的访问导致视图函数代码重复、乱的问题,Flask使用**上下文**使一些变量在一个线程中全局可访问,不会干扰其它线程
c). Flask有两种上下文:
* 程序上下文`current_app, g`
* 请求上下文`request, sessiom`
d). 上下文被推送`app_ctx.push()`后,就可以使用,否则会报错。
2. 请求调度
a). Flask使用`app.route`修饰器或者非修饰器形式的`app.add_url_rule()`生产映射
b). 通过`app.url_map`查看URL映射
c). 程序收到客户端发来的请求时,要找到处理该请求的视图函数
3. 请求钩子
a). 避免视图函数代码的重复,可用**请求钩子**:Flask提供注册通用函数的功能,可在请求被
分发到视图函数之前或之后调用
b). Flask支持4种钩子:
* `before_first_request`:第一个请求前运行
* `before_request`:每一次请求前运行
* `after_request`:没有未处理的异常抛出时,在每次请求之后运行
* `teardown_request`:即使有异常,每次请求后运行
c). 请求钩子函数与视图函数之间用`g`变量共享数据。例如`before_request`处理程序从数据库中加载已登录用户,并保存到`g.user`中,视图函数再使用`g.user`获取用户
4. 响应
a). 视图函数的返回值就是响应;可以添加**状态码**返回,默认值是200,表明请求被成功处理;响应可添加第三个参数,由首部`(header)`组成的字典,不常用
b). 使用`make_response`函数返回`Response`对象,然后在响应对象上调用各种方法,进一步设置响应
```
from flask import make_response
@app.route('/')
def index():
response = make_response('<h1>This document carries a cookie!</h1>')
response.set_cookie('answer', '42')
return response
```
c). **重定向**:特殊的响应类型,没有页面文档,只告诉浏览器一个新地址用以加载新页面,经常用于Web表单;302状态码表示
```
from flask import redirect
@app.route('/')
def index():
return redirect('www.baidu.com')
```
d). `abort()`产生了一种特殊响应,用于处理错误,返回状态码404;abort不会吧控制权交还给调用它的视图函数,而是抛出异常把控制权交给Web服务器
## 六、Flask扩展
# Chapter2 Flask 程序的基本结构
## 一、初始化 Flask
1. 使用`app = Flask(__name__)`创建程序实例
2. name参数决定了程序的根目录
## 二、路由和视图函数
1. **路由**:URL到Python函数的映射关系,Flask程序中定义路由的最简单式,是使用程序实例提供的`app.route`[**修饰器**](http://3ms.huawei.com/hi/group/3144251/thread_6049401.html?mapId=7580363&for_statistic_from=all_group_forum)
2. 修饰器是Python的标准特性,修改函数的行为,常用于把函数注册为事件的处理程序
3. 特定的URL触发服务器执行相应的函数,函数的返回值称为**响应**,该函数称为**视图函数**
4. `@aap.route('/user/<name>')`匹配包含可变部分的URL,尖括号内是动态部分,匹配静态部分的URL都会映射到路由上,动态部分作为参数传入视图函数
## 三、启动服务器
1. `app.run()`启动Web服务器
## 四、完整程序
1. 在地址栏输入`http://127.0.0.1:5000/`,可见视图函数的响应
## 五、请求-响应循环
1. 上下文
a). 为了让视图函数访问请求对象,可将其作为参数传入视图函数,但会增加函数的参数。Flask使用**上下文**临时把某些对象变为全局可访问。
b). Flask让特定的变量在一个线程中全局可访问,与此同时却不会干扰其他线程。
> 避免大量重复参数的访问导致视图函数代码重复、乱的问题,Flask使用**上下文**使一些变量在一个线程中全局可访问,不会干扰其它线程
c). Flask有两种上下文:
* 程序上下文`current_app, g`
* 请求上下文`request, sessiom`
d). 上下文被推送`app_ctx.push()`后,就可以使用,否则会报错。
2. 请求调度
a). Flask使用`app.route`修饰器或者非修饰器形式的`app.add_url_rule()`生产映射
b). 通过`app.url_map`查看URL映射
c). 程序收到客户端发来的请求时,要找到处理该请求的视图函数
3. 请求钩子
a). 避免视图函数代码的重复,可用**请求钩子**:Flask提供注册通用函数的功能,可在请求被
分发到视图函数之前或之后调用
b). Flask支持4种钩子:
* `before_first_request`:第一个请求前运行
* `before_request`:每一次请求前运行
* `after_request`:没有未处理的异常抛出时,在每次请求之后运行
* `teardown_request`:即使有异常,每次请求后运行
c). 请求钩子函数与视图函数之间用`g`变量共享数据。例如`before_request`处理程序从数据库中加载已登录用户,并保存到`g.user`中,视图函数再使用`g.user`获取用户
4. 响应
a). 视图函数的返回值就是响应;可以添加**状态码**返回,默认值是200,表明请求被成功处理;响应可添加第三个参数,由首部`(header)`组成的字典,不常用
b). 使用`make_response`函数返回`Response`对象,然后在响应对象上调用各种方法,进一步设置响应
```
from flask import make_response
@app.route('/')
def index():
response = make_response('<h1>This document carries a cookie!</h1>')
response.set_cookie('answer', '42')
return response
```
c). **重定向**:特殊的响应类型,没有页面文档,只告诉浏览器一个新地址用以加载新页面,经常用于Web表单;302状态码表示
```
from flask import redirect
@app.route('/')
def index():
return redirect('www.baidu.com')
```
d). `abort()`产生了一种特殊响应,用于处理错误,返回状态码404;abort不会吧控制权交还给调用它的视图函数,而是抛出异常把控制权交给Web服务器
## 六、Flask扩展