Flask:应用程序结构,以避免循环导入

时间:2016-06-07 01:02:56

标签: python flask

我正在关注掌握烧瓶推荐的文件结构。

(我的项目名称是Paw)

Paw/paw/__init__.py

def create_app(object_name):
  app = Flask(__name__)
  app.config.from_object(object_name)

  db.init_app(app)
  robot = LoggingWeRobot(token='banana', enable_session=True)
  robot.init_app(app, endpoint='werobot', rule='/wechat')

  attach_debugging_logger(app)

  app.register_blueprint(poll_blueprint)
  app.register_blueprint(wechat_blueprint)

  return app

请注意,我的蓝图中实际需要机器人变量,wechat,见于:Paw / paw / controllers / wechat.py

@robot.handler
def request_logging_middleware(message, session):
  app.logger.debug("\n%s", request.data)
  return False    # This allows other handlers to continue execution

所以我的问题是我的蓝图无法访问robot变量。但是,robot变量应该在Paw/paw/__init__.py中的create_app中创建,因为我正在尝试遵循应用程序工厂模式。

有关如何解决此问题的任何建议?我的项目可以找到here,我正在尝试关注this application structure

2 个答案:

答案 0 :(得分:1)

只需使用您用于db的相同模式 - 在其他地方创建robot并将其导入Paw/paw/__init__.py文件,就像使用db一样:

import db from models
import robot from wechat_setup
# wechat_setup is where you would invoke
# robot = LoggingWeRobot(token='banana', enable_session=True)

def create_app(object_name):
  app = Flask(__name__)
  app.config.from_object(object_name)

  db.init_app(app)
  robot.init_app(app, endpoint='werobot', rule='/wechat')

答案 1 :(得分:0)

我通常将项目全局变量放在一个文件中(比如gvars.py)。

然后项目结构将是这样的:

.
├── etc
│   └── webapp.py
├── models
│   └── common.py
├── views
│   └── common.py
├── gvars.py
└── webapp.py

在其他文件中我们只是这样做:

from gvars import db, robot # or other variables