在__init__.py中创建蓝图

时间:2019-02-18 20:11:37

标签: python flask blueprint

我具有以下应用程序结构

from flask import Blueprint, request

tayyariAuth = Blueprint('tayyariAuth', __name__)
from auth.controllers import register
from auth.controllers import login

蓝图在auth和tests程序包的 init .py文件中声明。

from flask import Blueprint, request

tayyariTests = Blueprint('tayyariTests', __name__)
from tests.controllers import get_tests

并在测试中/ 初始化 .py为

  File "app.py", line 8, in <module>
    from auth import tayyariAuth
  File "/Users/anuragjoshi/Work/Tayyari/tayyari/tayyari-rest/auth/__init__.py", line 5, in <module>
    from auth.controllers import register 
  File "/Users/anuragjoshi/Work/Tayyari/tayyari/tayyari-rest/auth/controllers/register.py", line 1, in <module>
    from auth import tayyariAuth, dao
  File "/Users/anuragjoshi/Work/Tayyari/tayyari/tayyari-rest/auth/dao.py", line 1, in <module>
    from decorators.queryAccessor import Query
  File "/Users/anuragjoshi/Work/Tayyari/tayyari/tayyari-rest/decorators/queryAccessor.py", line 1, in <module>
    from app import session
  File "/Users/anuragjoshi/Work/Tayyari/tayyari/tayyari-rest/app.py", line 9, in <module>
    from tests import tayyariTests
  File "/Users/anuragjoshi/Work/Tayyari/tayyari/tayyari-rest/tests/__init__.py", line 5, in <module>
    from tests.controllers import get_tests
  File "/Users/anuragjoshi/Work/Tayyari/tayyari/tayyari-rest/tests/controllers/get_tests.py", line 1, in <module>
    from tests import tayyariTests, request, dao, TayyariEncoder
  File "/Users/anuragjoshi/Work/Tayyari/tayyari/tayyari-rest/tests/dao.py", line 1, in <module>
    from decorators.queryAccessor import Query
ImportError: cannot import name 'Query' from 'decorators.queryAccessor' (/Users/anuragjoshi/Work/Tayyari/tayyari/tayyari-rest/decorators/queryAccessor.py)

两个蓝图都已在app.py中注册。 问题在于,两个 init .py文件最后都导入时,应用程序无法启动。 如果我从任何一个文件中删除了最后一个导入行,则该应用程序将启动,并且已注册的蓝图也可以正常工作。但是,在两个 init .py文件

中都存在导入时,出现以下错误
names_tok = [TaggedDocument(words=word_tokenize(name.lower()), tags=[str(i)])
                        for (i, name) in enumerate(names)]

# train model
max_epochs = 50
vec_size = 50
alpha = 0.025

model = Doc2Vec(size=vec_size,
                alpha=alpha,
                min_alpha=0.00025,
                min_count=1,
                dm=1)

请帮助我了解这里的情况以及如何避免这种情况。

谢谢。

2 个答案:

答案 0 :(得分:0)

似乎模块decorators.queryAccessor不在您的python路径中。 您如何导入这些蓝图?我通常有一种工厂方法来创建应用程序。在此方法中,我具有避免循环引用的导入,如下所示:

def create_app():
    # Your code here
    ...
    from auth import tayyariAuth
    app.register_blueprint(tayyariAuth)
    from tests import tayyariTests
    app.register_blueprint(tayyariTests)

答案 1 :(得分:0)

问题是由于@ j2logo正确指出的循环导入。但是,问题不是decorators.queryAccessor不在python路径上。

decorators.queryAccessor文件中的第一行是

from app import session

app.py内部,我正在导入包含我的蓝图的软件包的导入。

from auth import tayyariAuth
from tests import test_blueprint
上面的问题中给出了这些程序包中的

init .py文件。由于这些 init .py文件末尾的导入,因此正在导入login,register和get_tests模块,这些模块依次将dao.py模块导入各自的包中,并依次导入导入的decorators.queryAccessor

所以循环路径是

app.py -> auth -> auth/controllers/login.py -> auth/dao.py -> decorators.queryAccessor -> app.py

为解决这个问题,我提出了将逻辑初始化为与app.py相同级别的另一个文件db.py的逻辑,并通过导入db.py来创建所需的会话变量。 这为decorators.queryAccessor文件创建了所需的会话对象,我从db.py而不是app.py导入了会话,从而中断了循环导入。