关于 flask 循环导入的问题?求解释,这个算不算循环导入?

2019-03-22 11:46:48 +08:00
 Hopetree

看到一个 flask 项目,结构看的我非常喜欢,所以在学习。但是关于注册蓝图的操作我有点不理解,如下:

项目结构(部分)

--app
  --auth
     __init__.py
     views.py
--run.py

然后我看到auth.__init__.py这样注册蓝图

from flask import Blueprint

auth = Blueprint('auth', __name__)

from . import views

而在auth.views.py中又引用了 auth

from . import auth

@auth.route('/unconfirmed')
def unconfirmed():
    if current_user.is_anonymous or current_user.confirmed:
        return redirect(url_for('main.index'))
    return render_template('auth/unconfirmed.html')

我的理解是这两个文件里面在循环调用 auth 这个蓝图,这样做真的可以吗(当然运行没问题,我问的可以是这样的引用方式是否合理?)

说说我的做法,我在 views 里面不会引用 auth,而是这是一个函数,传入 auth,然后__init__.py中引入这个函数来注册蓝图

#__init__.py
from flask import Blueprint
from .views import init_blueprint

bp = Blueprint('main', __name__)


def init_app(app):
    init_blueprint(bp)
    app.register_blueprint(bp)

#views.py
from flask import jsonify, current_app


def index():
    return ''


def init_blueprint(bp):
    bp.add_url_rule('/', 'home', index)

我这样做主要是避免循环引入,求解释上面的那个代码算不散循环导入?这 2 个方式最大的区别在于第一种可以使用装饰器,第二种只能使用 add_url_rule 去注册路由

项目源码: https://github.com/miguelgrinberg/flasky/blob/master/app/auth/views.py

3242 次点击
所在节点    Flask
2 条回复
GTim
2019-03-22 12:06:32 +08:00
当然是不会的啦,因为它们都是到文件级别的,而不是函数变量级别的,不需要即刻扫描

Python 的 import 机制说复杂也复杂,说简单也简单。最重要的是理解: 在执行 import A 时,会先在 sys.modules 查找,如果找不到则会先创建一个 A 键,然后再填充 A 的具体东西
fngtz
2019-03-22 12:07:29 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/547346

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX