flask学习3-深入
flask学习-深入
- flask学习-深入
- 1. 应用程序结构和生命周期 — Flask 文档 (3.1.x)
- 2.应用程序上下文 — Flask 文档 (3.1.x)
- 3. 请求上下文 — Flask 文档 (3.1.x)
- 上下文的生命周期
- 手动推送上下文
- 关于代理的注意事项
- 4.使用蓝图的模块化应用程序 — Flask 文档 (3.1.x)
- 5.扩展 — Flask 文档 (3.1.x)
- 6.命令行界面 — Flask 文档 (3.1.x)
- 7. 开发服务器 — Flask 文档 (3.1.x)
- 8.Flask 的模式 — Flask 文档 (3.1.x)
- 9.使用 async 和 await — Flask 文档 (3.1.x)
- 10. 为什么要使用WSGI 服务器
- 1. **性能优化**
- 2. **稳定性与可靠性**
- 3. **安全性**
- 4. **与 Web 服务器的协作**
- 5. **扩展性**
- 6. **适合生产环境**
- 总结
- 补充:
- FastAPI 部署
flask学习-深入
1. 应用程序结构和生命周期 — Flask 文档 (3.1.x)
https://flask.palletsprojects.com/en/stable/lifecycle/#application-structure-and-lifecycle
- 为应用程序提供服务
- 浏览器或其他客户端发出 HTTP 请求。
- WSGI 服务器接收请求。
- WSGI 服务器将 HTTP 数据转换为 WSGI dict。
environ
- WSGI 服务器使用 .
environ
- WSGI 应用程序 Flask 执行其所有内部处理以路由请求 添加到 View 函数、处理错误等。
- Flask 将 View 函数返回转换为 WSGI 响应数据,传递给 WSGI 服务器。
- WSGI 服务器创建并发送 HTTP 响应。
- 客户端收到 HTTP 响应。
- 如何处理请求
- WSGI 服务器调用 Flask 对象,该对象调用.
- 将创建一个对象。这会将 WSGI dict 转换为对象。它还会创建一个对象。
environ``AppContext
- 应用程序上下文被推送,这 makes 和available。
- 信号已发送。
- 请求上下文被推送,这 makes和 available。
- 会话将打开,并使用应用程序的 实例加载任何现有会话数据。
- 该 URL 将与在应用程序设置期间向[装饰器注册的URL 规则进行匹配。如果没有匹配项,则错误 - 通常是 404, 405 或 redirect - 被存储以供以后处理。
- 信号已发送。
- 将调用任何``修饰的函数。
- 将调用任何``修饰的函数。如果 这些函数返回一个值,它会立即被视为响应。
- 如果 URL 在几个步骤前与路由不匹配,则现在会引发该错误。
- 与匹配的 URL 关联的修饰视图函数,并返回要用作响应的值。
- 如果到目前为止任何步骤引发了异常,并且存在与异常类或 HTTP 错误代码匹配的修饰函数,则为 调用以处理错误并返回响应。
- 无论返回响应值的内容 - before request 函数、视图还是 error 处理程序,该值将转换为 Object。
- 调用任何修饰的函数,然后清除。
- 任何装饰函数都会被调用,这些函数可以修改 响应对象。
- 会话将被保存,并使用应用程序的 .
- 信号已发送。
- 如果到目前为止任何步骤引发了异常,并且它未由错误处理程序处理 函数,它现在已处理。HTTP 异常被视为响应,其 对应的状态码,其他异常将转换为通用的 500 响应。信号已发送。
- 响应对象的 status、headers 和 body 将返回到 WSGI 服务器。
- 将调用任何修饰的函数。
- 信号已发送。
- 请求上下文已弹出,并且不再是 可用。
- 将调用任何修饰的函数。
- 信号已发送。
- 应用程序上下文已弹出并且不再 可用。
- 信号已发送。
2.应用程序上下文 — Flask 文档 (3.1.x)
https://flask.palletsprojects.com/en/stable/appcontext/
- 导入实例 在项目中的模块中容易出现循环导入问题,解决这个问题而生。
3. 请求上下文 — Flask 文档 (3.1.x)
https://flask.palletsprojects.com/en/stable/reqcontext/
上下文的生命周期
当 Flask 应用程序开始处理请求时,它会推送一个请求 context,该作也会推送 App 上下文。当 request 结束,它会先弹出 request 上下文,然后弹出 application 上下文。
上下文对于每个线程(或其他 worker 类型)都是唯一的。``无法传递给另一个线程,则另一个线程具有 不同的上下文空间,并且不会知道父级的请求 线程指向。
上下文局部变量是使用 Python 的 和 Werkzeug 的Python 管理 生命周期,本地代理会包装 低级接口,使数据更易于使用。
手动推送上下文
def generate_report(year):format = request.args.get("format")...with app.test_request_context("/make_report/2017", query_string={"format": "short"}
):generate_report()
关于代理的注意事项
Flask 提供的一些对象是其他对象的代理。这 每个 worker thread 的 proxies 访问方式相同,但是 指向幕后绑定到每个 worker 的唯一对象 在此页面上描述。
大多数时候,您不必关心这些,但有一些 例外情况,最好知道此对象实际上是一个代理:
- 代理对象不能将其类型伪装为实际对象类型。 如果要执行实例检查,则必须在 对象被代理。
- 在某些情况下需要对代理对象的引用, 例如发送 Signal 或将数据传递到后台 线。
如果需要访问代理的底层对象,请使用以下方法:_get_current_object()
app = current_app._get_current_object()
my_signal.send(app)
4.使用蓝图的模块化应用程序 — Flask 文档 (3.1.x)
https://flask.palletsprojects.com/en/stable/blueprints/
- 之前写博客和权限用的就是蓝图,懒得写了看上篇吧
5.扩展 — Flask 文档 (3.1.x)
https://flask.palletsprojects.com/en/stable/extensions/
6.命令行界面 — Flask 文档 (3.1.x)
https://flask.palletsprojects.com/en/stable/cli/
- <