我看过a very similar issue,但是该解决方案不适用于我,我想知道是否可以得到一些指导。
这是我的应用程序结构:
mosiman/
__init__.py
blog/
__init__.py
blogconfig.py
blog.py
static/
...
templates/
...
我真的很想一种方法来构建单独的应用程序,但可以从一个应用程序实例管理它们,这样我就不必接触WSGI层,而蓝图似乎是最好的方法。
我认为以下是相关文件:
# mosiman/__init__.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import blog.blog as blog
...
...
db = SQLAlchemy()
...
...
def create_app():
app = Flask(__name__)
db_path = os.path.join(os.path.dirname(__file__), 'mosiman.db')
app.config["SQLALCHEMY_DATABASE_URI"] = 'sqlite:///{}'.format(db_path)
app.config["SQLALCHEMY_BINDS"] = {'blog': os.path.join(os.path.dirname(__file__), 'blog/blog.db')
db.init_app(app)
app.register_blueprint(blog.blog, url_prefix='/blog')
return app
if __name__ == '__main__':
app = create_app()
app.run(debug=True)
我的mosiman/blog/blog.py
文件中也有
#mosiman/blog/blog.py
<<< all of the usual flask imports and SQLAlchemy, etc >>>
from .__init__ import db
blog = Blueprint('blog', __name__)
...
...
class Entry(db.Model):
__bind_key__ = "blog"
id = db.Column(db.Integer, primary_key = True)
title = db.Column(db.String(150))
...
...
这是我的问题:我实际上没有“默认”数据库,因此没有适用的类。但是我确实想使用类Entry
来初始化我的博客数据库。
initializing the database的默认过程似乎是弹出python REPL,导入数据库,然后运行db.create_all()
好吧,我不能仅导入db
并运行db.create_all()
,因为db
尚未附加到应用程序(在create_app()
中完成)我继续:
# pop open a REPL at mosiman/
>>> from __init__ import db
>>> from __init__ import create_app
>>> app = create_app()
>>> db.init_app(app)
>>> from blog.blog import Entry
>>> db.init_app(app)
# At this point, db still isn't attached to an engine?
>>> db
<SQLAlchemy engine=None>
>>> with app.app_context():
... db.create_all()
...
>>>
现在,当我转到mosiman/blog/
时,我发现已经创建了blog.db
,但是当我在SQLite3中检查架构和表时,什么也没出现。
1通过将from __init__ import db
更改为from mosiman import db
如果我尝试在mosiman/
内这样做:
>>> from mosiman import db
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'mosiman'
即使我那里有__init__.py
。
如果我从../
(mosiman
上方的目录)运行它:
>>> from mosiman import db
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/users/d49chan/mosiman/__init__.py", line 3, in <module>
import blog.blog as blog
ModuleNotFoundError: No module named 'blog'
我不确定如何继续。也许是因为我需要睡觉,但是我一直在试图理解为什么在过去的几个小时里没有任何反应。如果您能指出正确的方向或消除我的一些误解,我将不胜感激。
答案 0 :(得分:0)
1)您不是导入__init__.py
。您应该使用其中的目录(包)的名称导入它。
2)您不应该这样导入:import blog.blog
。相反,您应该:from blog import blog
。
3)确保每个目录中都有一个__init__.py
文件,以便python导入程序将其视为可以从中导入的包(目录)。
4)相对导入和绝对导入之间是有区别的。
# l3_module.py in l3_package
from ..l1_package import l1_module
这将导入一个模块,该模块相对于导入模块位于两个包(目录)上方。
现在假设l3_package位于l1_module的l2_package中,您也可以这样导入
# l3_moudle.py in l3_package
from l1_package import l1_module
这也可以工作,但是有时会把东西弄乱,具体取决于您的环境。 这是一个很好的答案,可以为您清除一些问题:Relative imports for the billionth time。
希望有帮助:)