1.初始化
所有Flask应用都必须创建一个应用实例。Web服务器使用一种名为Web服务器网关接口(WSGI,Web server gateway interface,读作“wiz-ghee”)的协议,把接收自客户端的所有请求都转交给这个对象处理。应用实例是Flask类的对象,通常由下述代码创建:
from flask import Flask app = Flask(__name__)
2.路由和视图函数
在Flask应用中定义路由的最简便方式,是使用应用实例提供的app.route装饰器。下面的例子说明了如何使用这个装饰器声明路由:
@app.route('/') def hello_world(): # put application's code here return 'Hello World!'
带有参数的路径使用:
@app.route('/user/<name>') def user(name): return '{}'.format(name)
例如:访问路径
http://127.0.0.1:5000/user/dahe
还可以指定某一个数据类型的路径信息:
@app.route('/user/<int:id>') def user(id): return '{}'.format(id)
lask支持在路由中使用string、int、float和path类型。path类型是一种特殊的字符串,与string类型不同的是,它可以包含正斜线
3.Web开发服务器
Flask应用自带Web开发服务器,通过flask run命令启动
没有flask命令的旧版Flask中,若想启动应用,要运行应用的主脚本。主脚本的尾部包含下述代码片段:
if __name__ == '__main__': app.run()
4.调试模式
Flask应用可以在调试模式中运行。在这个模式下,开发服务器默认会加载两个便利的工具:重载器和调试器。
启用重载器后,Flask会监视项目中的所有源码文件,发现变动时自动重启服务器。在开发过程中运行启动重载器的服务器特别方便,因为每次修改并保存源码文件后,服务器都会自动重启,让改动生效。
调试器是一个基于Web的工具,当应用抛出未处理的异常时,它会出现在浏览器中。此时,Web浏览器变成一个交互式栈跟踪,你可以在里面审查源码,在调用栈的任何位置计算表达式。
若想以编程的方式启动调试模式,可以通过如下方式启动flask项目:
if __name__ == '__main__': app.run(debug=True)
千万不要在生产服务器中启用调试模式!❌
5.请求–响应循环
应用和请求上下文
为了避免大量可有可无的参数把视图函数弄得一团糟,Flask使用上下文临时把某些对象变为全局可访问。有了上下文,便可以像下面这样编写视图函数来判断用户的来源浏览器:
from flask import Flask, request @app.route('/') def hello_world(): user_agent = request.headers.get('User-Agent') return 'Hello World Dahe!{}'.format(user_agent)
输出如下:
Hello World Dahe!Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.
在Flask中有两种上下文:应用上下文和请求上下文:
flask所有请求对象:
flask所有请求对象:
响应
如果视图函数返回的响应需要使用不同的状态码,可以把数字代码作为第二个返回值,添加到响应文本之后。例如,下述视图函数返回400状态码,表示请求无效:
from flask import Flask, request @app.route('/') def hello_world(): user_agent = request.headers.get('User-Agent') return 'Hello World Dahe!{}'.format(user_agent), 400
下例创建一个响应对象,然后设置cookie:
from flask import make_response @app.route('/') def index(): response = make_response('<h1>This document carries a cookie!</h1>') response.set_cookie('yours', '1314') return response
响应对象最常使用的属性和方法:
from flask import Flask, redirect @app.route('/') def hello_world(): return redirect('https://www.baidu.com/')
特殊响应
重定向
Flask提供了redirect()辅助函数,用于生成这种响应:
异常
还有一种特殊的响应由abort()
函数生成,用于处理错误
@app.route('/user/<int:id>') def user(id): if id == 1: abort(404) return '{}'.format(id)
此时访问如下路径,会发生如下错误:
http://127.0.0.1:5000/user/1