我想将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 socketio
或from .. import socketio
。
任何人都能告诉我问题在哪里吗?我该怎么办?
答案 0 :(得分:0)
因为__init__.py
from develop.controllers.panel import panel_route
之前
socketio = SocketIO()
当panel.py
中的任何代码(例如from develop import socketio
或from .. import socketio
)被执行时,socketio
命名空间中没有任何名为develop
的内容,导入肯定会失败
因此,您应该调整__init__.py
中代码行的位置以进行快速修复。但它仍然不是一个好的做法,代码将在未来重构。