1.一个完整的程序
学习一门系统开发语言,我们可以通过1个最基本结构的程序,来了解程序的运行逻辑。有句俗语:“麻雀虽小,五脏俱全”。
程序例子如下(hello.py):
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello, Everyone.</h1>'
if __name__ == '__main__':
app.run(debug=True)
在命令行窗口运行python hello.py,即启动了1个后台程序,但是此时的host和port没有指定,使用默认的127.0.0.1和5000。启动的程序会进入轮询,等待并处理请求。如果要停止程序,可按Ctrl-C停止。
此时,如果在浏览器输入http://127.0.0.1:5000/并enter,即向该程序发送了请求,程序定位到index处理函数并返回html文本,最后浏览器进行渲染展示。
下面对这个demo程序,进行简单的说明
1.1初始化
所有Flask程序都必须创建一个程序实例,而程序实例就是1个Flask类初始化后的对象。
web服务器使用web服务器网关接口(WSGI)协议,把来自客户端的所有请求都转交给这个对象处理。
大多数时候,我们使用以下代码创建程序实例,Flask类的构造函数只有1个必须指定的参数,即程序主模块或包的名字。
app = Flask(__name__)
Flask用__name__这个参数决定程序的根目录,以便能够找到相对于程序根目录的资源文件位置。
1.2路由和视图函数
请求通过 “客户端–发送请求–>web服务器–转发请求–>程序实例” 到达后,程序实例需要知道每个url运行哪段代码,所以保存了URL到python函数的映射关系。而处理URL和函数之间关系的程序称为路由。
在Flask中,使用程序实例提供的app.route装饰器,即可把装饰的函数注册为路由。被装饰的函数如index()称为视图函数(view function),在路由中URL和视图函数是一对绑定关系。
@app.route('/')
def index():
return '<h1>Hello, Everyone.</h1>'
在日常上网中,我们会发现很多地址包含可变部分。比如地址http://www.funny.com/{user-id},用户ID是地址中的可变部分。
Flask也支持了这种形式的URL,只需要在route装饰器使用特殊的语法。例子如下:
# 示例一
@app.route('/user/<name>')
def greet_user(name):
return '<h1>Hello, %s.</h1>' % name
# 示例二
@app.route('/book/<int:id>')
def book_info(id):
return '<h1>The book id is %d, and its title is Hello World.</h1>' % id
尖括号里的内容是动态的,任何能匹配静态部分的URL都会映射到这个路由上来。调用视图函数时,Flask会把动态部分作为参数传入,但是视图函数要明确写出参数名称。。。
Flask支持在路由中定义int、float和path类型,如果没有定义(代码示例一)默认使用字符串,而/book/<int:id>只会匹配动态片段id是整数的URL,path类型也是字符串,但不把斜线作为分隔符。
1.3启动服务器
观察文章开头的程序demo,可以发现:程序实例用run()即可启动Flask集成的web服务器。同时,在启动后的服务器日志中,发现了“别在生产环境中使用”的警告!使用专门的web服务器,将在后续进行探索…
在demo中,run()传入了debug=True,因为在开发过程中启用调试模式能方便查找问题。
查看run函数使用,同时支持定义host和port,函数定义有run(self, host=None, port=None, debug=None, load_dotenv=True, **options)