我正在努力为我正在创建的Flask应用程序创建新的脚本。我有以下目录结构:
/myapp
/config.py
/app
/__init__.py
/routes.py
/models.py
/niche_script.py
/templates/
/...
/venv__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config Import Config
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
from app import routes, models, niche_scriptniche_script.py
try:
from app import app, db
from app.models import User
print("Import 1")
except:
print("Import 2")
'''do stuff'''
if __name__="__main__":
print("do stuff")当我使用flask run运行应用程序并调用脚本的功能时,Import 1就会被打印出来。但是,如果我试图自己运行脚本,就会打印Import 2。我希望能够独立运行脚本,以测试一些数据库查询,而不必每次运行烧瓶应用程序。但是,就目前情况而言,如果运行独立的脚本不承认app是一个模块,我不知道如何将db导入到脚本中。
顺便提一句,仅仅在shell中完成所有这些工作是否是通常的工作流程?还是有一个更好的开发过程,我不知道
发布于 2020-01-05 01:47:54
根据运行的位置和安装包的方式,行为将有所不同。
要使它快速、容易地工作,首先要做的就是将/myapp的完整路径添加到PYTHONPATH环境变量中。flask run命令很可能会自动地将当前的工作目录添加到python (或者您已经将其配置为特定于FLASK_APP的某个位置)。
尝试将cd-ing放入不同的目录,并查看它的不同之处。
第二个“更干净”的方法是将您的app包作为可安装的包。这意味着您为它创建了一个基本的setup.py文件,然后您可以pip install -e /path/to/myapp/,然后一切都设置为“正确的方式”,而不必处理环境变量等等。
值得一提的是,在执行此类脚本和Flask时,您必须记住,在您所做的某些事情中可能需要“应用上下文”和“请求上下文”。当你以“正常的方式”运行应用程序时,它都是由你自己管理的,但在这种情况下,你可能不得不自己去做:有大量的文档和例子,但一开始可能并不简单。从你的帖子中还不清楚你是否已经知道了,但是如果你不知道的话,告诉你这件事也没什么坏处。
一些一般性建议
我建议您将niche_script.py文件从app包中移出,这与您的问题并不严格相关。如果它只是为了测试一些东西,并且作为快速迭代某些特性的游乐场,那么它可能不应该是您的“主”代码库的一部分。
我这样做的方法是在特定目录中使用我忽略的脚本(只在我的机器上,而不是在真正的.gitignore上),然后实际测试有用的东西,而不是一些实验进入一个专用的tests/目录(我使用pytest )。
我希望这能帮到你。
https://stackoverflow.com/questions/59596352
复制相似问题