基于 Python 的 Web 应用开发实战中,hello.py shell 命令无法进入交互式 shell 如何解决?
大哥你连个报错信息都不发,让我们猜?
这个问题我遇到过。你的 hello.py 文件里很可能没有正确设置 Flask 的应用上下文。
Flask 的交互式 shell 需要手动推送应用上下文才能访问 app 实例和相关数据库对象。直接运行 flask shell 命令时,Flask 会自动寻找名为 app 或 application 的实例,但如果你的应用工厂模式或导入方式不同,就需要额外配置。
解决方案:
-
检查 FLASK_APP 环境变量 确保你的
FLASK_APP指向正确的模块。例如:export FLASK_APP=hello.py或者使用:
export FLASK_APP=hello:app -
在 hello.py 中显式创建 app 实例 如果你的应用使用工厂模式,确保在模块顶层有可访问的
app实例:from flask import Flask app = Flask(__name__) [@app](/user/app).route('/') def hello(): return 'Hello World!' if __name__ == '__main__': app.run() -
使用 flask.cli.load_dotenv() 加载环境变量 在
hello.py开头添加:from flask.cli import load_dotenv load_dotenv() -
手动推送应用上下文 如果以上都不行,在启动 shell 后手动推送上下文:
>>> from hello import app >>> app.app_context().push()
快速测试:
运行 flask routes 如果能正常显示路由,说明 FLASK_APP 设置正确,否则需要检查上述配置。
总结:检查 FLASK_APP 环境变量和应用实例的导出方式。
怪我疏忽,问题就是没有任何信息输出。
大概搜了一下书名,找到的是关于 flask 的书,相关片段:
示例 5-7 hello.py:为 shell 命令添加一个上下文
from flask.ext.script import Shell
def make_shell_context():
return dict(app=app, db=db, User=User, Role=Role)
manager.add_command(“shell”, Shell(make_context=make_shell_context))
make_shell_context() 函数注册了程序、数据库实例以及模型,因此这些对象能直接导入 shell:
$ python hello.py shell
根据你的描述推测是未调用 manager.run(),此书在示例 2-3 的代码中有:
if name == ‘main’:
manager.run()
另外书中代码很多地方都是针对旧版本的 flask,推荐还是从官方的最新文档开始入门
这本书,坑看到不到一半,发现版本问题很大的障碍。
我猜应该是需要 set FLASK_APP=hello.py
感谢,是这个原因。
他的 github 库内容比较书本还是有更新了的。但是没想到也不能直接使用。感觉上下文联系的太强了,看书比较马大哈,一有看漏就接不上。
谢谢,设置 FLASK_APP 后只是可以用 flask run 运行吧。
百度第一条来的,新版用 pip install flask-script,导入 from flask_script import Manager,注册 manager = Manager(app),运行 if name == ‘main’: manager.run()。
https://blog.csdn.net/theShepherd/article/details/86764926

