python - 启动服务器时 Flask 项目中的 _init_ 文件如何工作?
问题描述
我正在阅读Flask 教程并了解到在大型应用程序结构中,代码从单个app.py
文件移动到文件中的“应用程序工厂函数” create_app
,_init_.py
然后可以像这样启动服务器:
export FLASK_APP=flaskr
export FLASK_ENV=development
flask run
我想知道最后一个命令在幕后是如何工作的,因为在代码中的任何地方都没有明确调用这个工厂函数,因此没有返回应用程序?
另一个Flask 文档试图解释为什么使用这种项目结构,但在这种情况下,代码_init_.py
会app
显式创建:
from flask import Flask
app = Flask(__name__)
import yourapplication.views
需要init .py 文件才能使 Python 将目录视为包含包;这样做是为了防止具有通用名称(例如字符串)的目录无意中隐藏模块搜索路径上稍后(更深)出现的有效模块。在最简单的情况下,init .py 可以只是一个空文件,但它也可以执行包的初始化代码或设置 all变量,稍后将介绍。
最后一句提到了可以在第二种情况下应用的“初始化代码”(以及带有app.py
文件的简单项目结构),但我未能将其应用于第一种情况。
解决方案
在烧瓶源代码中,他们检查是否存在调用的函数create_app
。
# Search for app factory functions.
for attr_name in ('create_app', 'make_app'):
app_factory = getattr(module, attr_name, None)
if inspect.isfunction(app_factory):
try:
app = call_factory(script_info, app_factory)
if isinstance(app, Flask):
return
它甚至在文档中这样说:
Flask 会自动检测 myapp 中的工厂(create_app 或 make_app)。
推荐阅读
- docker - docker-compose 挂载卷上的 WSL 文件权限问题
- java - 如何在 @CacheEvict#key 的 SpEL 中获取#root.args[0] 的字段
- r - 编写一个 R 函数来查找余弦相似度
- c - 如何在 C 中检查 scanf 中的额外输入?
- reactjs - 如何在 reactjs 中破坏这个对象和映射?
- python - Discord Python 机器人的嵌入
- jquery - 如何更快更好地使用 jquery 对表 tr 进行分组
- c# - 如何在 EF Core 中使用 Table-Values 参数?
- excel - VBA代码导致excel中出现莫名其妙的字符
- javascript - 如何在经典报告中粘贴区域标题并添加垂直滚动条