我无法从Flask中的__init__导入?

时间:2017-04-07 05:42:54

标签: python flask

我想将socketio从我的主app文件夹中存在的 init .py文件导入到控制器文件夹中存在的主控制器中,但我不能这样做,会出现一个错误:

ImportError:无法导入名称socketio

这是我的应用树:

├── add_permissions.txt
├── db_init.py
├── develop
│   ├── config.py
│   ├── controllers
│   │   ├── abonent.py
│   │   ├── events.py
│   │   ├── __init__.py
│   │   ├── panel.py
│   │   └── users.py
│   ├── extentions.py
│   ├── forms.py
│   ├── forms.pyc
│   ├── __init__.py
│   ├── models.py
│   ├── plugins.py
│   ├── requests.py
│   ├── send_sms.py
├── init.sh
├── manage.py

我的 __ init __。py 的内容我在哪里创建应用:

from flask import Flask

from develop.controllers.abonent import abonent_route
from develop.controllers.panel import panel_route

from flask_principal import identity_loaded, UserNeed, RoleNeed
from flask_login import current_user

from develop.extentions import (
    login_manager,
    toolbar,
    assets_env,
    cache,
    moment,
    principal
)

from develop.models import (
    db,
    User
)

from flask_socketio import SocketIO
socketio = SocketIO()

def create_app(config_object):

    app = Flask(__name__)
    app.config.from_object(config_object)

    ######## Register Database ########

    db.init_app(app)
    # csrf.init_app(app)

    ######## Register Extentions ########

    login_manager.init_app(app)
    toolbar.init_app(app)
    assets_env.init_app(app)
    moment.init_app(app)
    principal.init_app(app)

    socketio.init_app(app)

    ######## Register Routes ########

    app.register_blueprint(abonent_route)
    app.register_blueprint(panel_route)

    # Identify the users roles
    @identity_loaded.connect_via(app)
    def on_identity_loaded(sender, identity):
        # Set the identity user object
        identity.user = current_user

        # Add the UserNeed to the identity
        if hasattr(current_user, 'id'):
            identity.provides.add(UserNeed(current_user.id))

        # Add each role to the identity
        if hasattr(current_user, 'roles'):
            for role in current_user.roles:
                identity.provides.add(RoleNeed(role.name))

    return app

正如您所看到的,我已经开始使用应用程序进行socketio,现在没有错误说明。

panel.py 内,如果我从开发导入了socketio,则错误会显示我使用from develop import socketiofrom .. import socketio

任何人都能告诉我问题在哪里吗?我该怎么办?

1 个答案:

答案 0 :(得分:0)

因为__init__.py

中的行
from develop.controllers.panel import panel_route

之前

socketio = SocketIO()

panel.py中的任何代码(例如from develop import socketiofrom .. import socketio)被执行时,socketio命名空间中没有任何名为develop的内容,导入肯定会失败

因此,您应该调整__init__.py中代码行的位置以进行快速修复。但它仍然不是一个好的做法,代码将在未来重构。