在\uu init\uuy.py中创建蓝图

2024-10-01 04:53:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下应用程序结构

/application
  app.py
  /decorators
    queryAccessory.py
  /auth
    __init__.py
    dao.py
    /controllers
      login.py
      register.py
    /models
      user.py
      get_user_response.py
  /tests
    __init__.py
    dao.py
    /controllers
      get_tests.py
    /models
      test.py
      get_tests_response.py

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

^{pr2}$

在测试中/init.py as

from flask import Blueprint, request

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

两份蓝图都登记在应用程序副本. 问题是当init.py文件的末尾都有导入时,应用程序不会启动。 如果我从任何1个文件中删除最后的导入行,应用程序就会启动,注册的蓝图就可以正常工作了。但是,当导入同时存在于init.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)

请帮助我了解这里发生了什么,以及如何避免这种情况。在

提前谢谢。在


Tags: infrompyimportauthrestlinetests
2条回答

似乎模块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)

问题是因为@j2logo正确地指出了一个循环导入。但是,问题不是decorators.queryAccessor不在python路径上。在

decorators.queryAccessor文件中的第一行是

from app import session

在我的app.py中,我调用了包含我的蓝图的包的导入。在

^{pr2}$

上面的问题给出了这些包中的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

为了解决这个问题,我去掉了逻辑,将数据库初始化到另一个文件中数据库同级应用程序副本并通过导入创建所需的会话变量数据库在任何事情之前。 这为decorators.queryAccessor文件创建了所需的会话对象,我从db.py而不是{}导入了会话,从而中断了循环导入。在

相关问题 更多 >