2.1 Flask Web 应用的不同组成部分¶
首先看一个最小的 Web 应用:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello, World!</h1>'
上面这个脚本定义了一个应用实例、一个路由和一个视图函数,即是 Flask Web 应用的各组成部分。
2.1.1 应用实例¶
所有 Flask 应用都需创建一个应用实例,是 Flask 类的对象。Web 服务器使用 WGSI 协议,把接收自客户端的所有请求都转交给这个对象。
from flask import Flask
app = Flask(__name__)
Flask
类实例化时必须传入一个指定的参数,即应用主模块或者包的名称。大多数应用中,传入__name__
作为参数。Flask
用这个参数确定应用的位置,进而找到其他文件的位置,如图像和模板。
2.1.2 路由¶
客户端(如浏览器)将请求发送给 Web 服务器,Web 服务器再把请求发送给 Flask 应用实例。应用实例需要知道对每个 URL 的请求要执行哪些代码,所以保存了 URL 到 Python 函数的映射关系。处理 URL 和函数值间关系的程序称为路由。
在 Flask 应用中定义路由的最简单方式是使用应用实例提供的 app.route 装饰器,把函数绑定到 URL:
@app.route('/')
def index():
return '<h1>Hello, World!</h1>'
装饰器将函数注册为事件处理程序,在特定事件发生时调用。上述示例把 index() 函数注册为应用程序根地址的处理程序。
在日常应用中, URL 可能包含可变的部分,路由 URL 中放在尖括号里的内容就是动态部分,任何能匹配到静态部分的 URL 都会映射到这个路由上。
@app.route('/user/<username>')
def index():
return '<h1>Hello, {}}!</h1>'.format(username)
路由中的动态部分除了默认使用字符串,还支持其他类型。通过使用
<converter:variable_name>
,可以选择性的加上一个转换器,为变量variable_name
指定规则。
转换器(converter)类型:
转换器类型 |
描述 |
---|---|
string |
接受任何不包含斜杠的文本 |
int |
接受正整数 |
float |
接受正浮点数 |
path |
类似 string,但可以包含斜杠 |
uuid |
接受 UUID 字符串 |
例如,路由 /user/<int:id>
只会匹配动态片段 id 为整数的 URL。
2.1.3 视图函数¶
处理入站请求的函数为视图函数。上面示例中的 index()
函数就是一个视图函数。如果应用部署在域名为 www.example.com
的服务器上,浏览器访问该域名后,会触发服务器执行视图函数
index()
,函数的返回值为响应,即浏览器接收到的内容。
2.1.4 url_for¶
url_for()
函数用于构建指定函数的
URL,将视图函数名作为第一个参数。它可以接受任意个关键字参数,每个关键字参数对应
URL 中的变量。未知变量将添加到 URL 中作为查询参数。
from flask import Flask, url_for
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello, World!</h1>'
with app.test_request_context():
print(url_for('index', _external=True))
返回一个绝对地址:http://localhost/
2.1.5 Web开发服务器¶
Flask 应用自带 Web 开发服务器,通过 flask run
命令启动:
(venv) [root@centos7 flasky]$ export Flask_APP=hello.py
(venv) [root@centos7 flasky]$ flask run
* Serving Flask app "hello.py"
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
Flask Web 开发服务器也可以通过编程的方式启动,调用 app.run()
方法。若要启动应用,需要执行应用的主脚本,在脚本中包含下面代码:
if __name__ == '__main__':
app.run()
2.1.6 调试模式¶
Flask 应用可以在调试模式下运行。调试模式默认禁用,若想启用,在执行
flask run
命令前设定 FLASK_DEBUG=1
环境变量:
(venv) [root@centos7 flasky]$ export Flask_APP=hello.py
(venv) [root@centos7 flasky]$ export FLASK_DEBUG=1
(venv) [root@centos7 flasky]$ flask run
* Serving Flask app "hello.py" (lazy loading)
* Debug mode: on
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger PIN: 277-103-738
若想以编程的方式启动调试模式,就使用 app.run(debug=True)
。