Flask(2)-程序的基本结构
1. 初始化
Flask程序需要创造一个程序实例。Web服务器使用WSGI协议,将客户端所有请求交给这个实例(对象)处理。
from flask import Flask
app = Flask(__name__)
- Flask类的构造函数(__init__())只有一个必须的参数,即程序主模块或包的名,这里使用__name__变量表示。
2. 路由和视图函数
路由:客户端把请求发给Web服务器,服务器把请求发给Flask实例。对每个URL都有一个处理函数,处理URL和函数之间关系的程序称为路由。
定义路由的简单方法,使用route修饰器,把修饰器的函数注册为路由,这样URL和函数之间关系就确定了。
@app.route('/')
def index():
return '<h1>Hello World!</h1>'
index函数称为视图函数,返回值称为响应。
- 返回的响应可以是字符串、表单。
定义动态路由:
app.route('/user/<name>')
def user(name):
return '<h1>Hello, %s!</h1>' % name
- 尖括号内为动态部分,默认使用字符串,也可使用其他类型。
如路由/user/<int:id>,只会匹配动态字段id为整数的URL。 - Flask支持在路由中使用int、float和path类型。
path也是字符串,只是不把斜线视为分隔符,当作动态片段的一部分。
3. 启动服务器
if __name__ == '__main__':
app.run(debug=True)
此段含义为当直接执行这段程序时运行app,若由其他脚本引入,则不执行。
- debug=True为调试模式。
4. 完整程序
如下hello.py
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
return '<h1>Hello World!</h1>'
def user(name):
return '<h1>Hello %s!</h1>' %s name
if __name__ == '__main__':
app.run(debug=True)
运行hello.py,访问http://localhost:5000;访问http://localhost:5000/user/Michael;
5. 请求-响应
请求上下文
Flask从客户端收到请求,需要访问一些对象。视图函数访问对象,一个方法是把对象作为参数传入函数,但这会很麻烦,这时使用上下文临时把某些对象变为全局可访问,这样就不用一个个的传入函数。
from flask import request
@app.route('/')
def index():
user_agent = reguest.headers.get('User-agent')
return '<p>Your brower is %s</p>' % user_agent
- 在这个视图函数中,把request当作全局变量使用。
Flask中的上下文: 程序上下文和请求上下文。
- current_app
- g
- request
- session
Flask在分发请求之前激活 (或推送)程序和请求上下文,请求处理完成后删除。如果在使用之前没有激活,则会报错。
请求调度
Flask使用app.route修饰器或非修饰器形式的app.add_url_rule()生成映射。
查看URL映射(确保激活虚拟环境):
>>>from hello import app
>>>app.url_map
请求钩子
在处理请求之前或之后执行代码,叫做钩子。
请求钩子使用修饰器实现。有四种钩子:
- before_first_request
- before_request
- after_request
- teardown_request
响应
HTTP响应返回1个、2个或3个值组成的元组,由字符串、状态码、首部组成的字典三部分组成。
还可返回Response对象。make_response()函数用于生成response对象,接受1个、2个或3个参数,与元组对应。这样我们可以在返回对象上应用各种方法,进一步设置响应。
- 重定向的特殊响应 - 没有页面文档,只有一个新地址,常用于Web表单。用redirect()函数设置这种响应。
from flask import redirect
@app.route('/')
def index():
return redirect('http:www.sina.com.cn')
- abort函数特殊响应
from flask import abort
@app.route('/')
def get_user(id):
user = load_user(id)
if not user:
abort(404)
return '<h1>Hello, %s</h1>' % user.name
返回码:
- 200 成功
- 302 重定向
- 404 失败
6. 扩展
使用Flask-Script支持命令行选项
Flask-Script扩展为程序添加一个命令行解析器:
hello.py: 使用Flask-Script
from flask.ext.script import Manager
manager = Manager(app)
# ...
if __name__ == '__main__':
manager.run()
- 专为Flask开发的扩展都在flask.ext命名空间下。Flask-script输出一个Manager的类。
- 扩展的初始化方法:把程序实例作为参数传给构造函数,初始化主类的实例。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术