如何使用Flask从__init__.py导入

8

我有一个 Flask 应用的以下文件结构:

myapplication/
  run.py
  myapplication/
    __init__.py
    views/
      __init__.py
      models.py
      ...
    templates/
    static/

我已在myapplication/__init__.py中使用SQLAlchemy初始化了数据库。但我想在models.py中导入数据库对象,不过我不确定该如何实现。

我阅读了这个答案,并尝试使用相对导入从myapplication/__init__.py中导入数据库对象,像这样:

from ... import db

但是我收到了这个错误:ValueError: Attempted relative import in non-package

那么我怎样才能在models.py中获取myapplication/__init__.py中的数据库对象呢?谢谢。

1个回答

8
在您的views文件夹中添加一个名为__init__.py的空文件。 另外,我认为你多了一个点,应该是from .. import db。第一个.是引用views,第二个.将引用您的__init__.py编辑:我查看了我自己完成的flask项目(freevle),似乎我从未使用过相对导入来访问数据库。相反,我使用了应用程序名称,即您顶部的__init__.py所在文件夹的名称。在freevle中,我使用了from freevle import db。这对您有用吗?

我在views文件夹中确实有__init__.py,只是忘记在问题中包含它了,我刚刚更新了它。我尝试使用from .. import db,但是得到了相同的错误。 - Pav Sidhu
抱歉,我在使用Python创建包方面还比较新手。那么包的名称是否就是包含__init__.py文件的根目录? - Pav Sidhu
啊,是的,我的错。我应该说应用程序,而不是包。 - Martin
只是为了澄清, . 表示当前包;两个点表示 "上一级包"(它们不指代文件名);来自pep-0328:"两个或多个前导点相对导入到当前包的父级,每个点从第一个点开始算一层。" - 除了特殊情况下的 __init__.py - Burhan Khalid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接