我无法使用 app.from_object 参数初始化 Flask SocketIO
I cannot initialize Flask SocketIO with app.from_object parameter
我有一个 app.py 文件,用于初始化我的应用程序。我有另一个文件 (run.py),我从中 运行 Flask 服务器。一切都适用于标准的烧瓶应用程序。但是,我正在尝试集成 flask-socketio,它会不断失败并出现不同的错误,具体取决于我尝试初始化应用程序的方式。
我试过以下方法初始化flask-socketio:
socketio = SocketIO(app.config.from_object(app_config[env_name]))
socketio = SocketIO(app, **app.config[env_name])
socketio = SocketIO(**app.config[env_name])
这是我的 app.py 文件中的相关代码。
def create_app(env_name):
"""
Create app
"""
# app initiliazation
app = Flask(__name__)
app.config.from_object(app_config[env_name])
async_mode = None
# initializing bcrypt and db
bcrypt.init_app(app)
db.init_app(app)
socketio = SocketIO(app.config.from_object(app_config[env_name]))
return socketio
我的 run.py 文件如下所示:
rom src.app import create_app
load_dotenv(find_dotenv())
env_name = os.getenv('FLASK_ENV')
app = create_app(env_name)
if __name__ == '__main__':
port = os.getenv('PORT')
# run app
app.run(app, host='0.0.0.0', port=port)
您会注意到我正在从 config.py 文件导入。这就是我的环境变量所在的地方(开发、测试、生产)。每个环境都是它自己的 class。例如:
class Development(object):
"""
Development environment configuration
"""
DEBUG = True
TESTING = False
SQLALCHEMY_TRACK_MODIFICATIONS=False
JWT_SECRET_KEY = os.getenv('JWT_SECRET_KEY')
SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL')
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
UPLOADED_FILES_DEST = os.getenv('UPLOADED_FILES_DEST')
如您所见,大部分值都设置在环境变量中,因为将此类敏感信息放入存储库是一种不好的做法。
我希望能够初始化 flask-socketio,这样我就可以设置用户可以共享基于位置的信息的房间。
提前致谢。
Flask-SocketIO 扩展将应用程序实例作为参数。您应该配置应用程序,然后对其进行初始化。例如:
app.config.from_object(app_config[env_name])
socketio = SocketIO(app)
我发现了问题。我无法在 app.py 文件中实例化 SocketIO。我必须从我的 app.py 文件导出应用程序并在我的 run.py 文件中实例化 SocketIO。我的最终代码如下所示:
app.py
def create_app(env_name):
"""
Create app
"""
# app initiliazation
app = Flask(__name__)
app.config.from_object(app_config[env_name])
# initializing bcrypt and db
bcrypt.init_app(app)
db.init_app(app)
return app
最后,我的 run.py 文件看起来像这样。
import os
import logging
from dotenv import load_dotenv, find_dotenv
from flask_socketio import SocketIO, join_room, emit
from src.app import create_app
load_dotenv(find_dotenv())
env_name = os.getenv('FLASK_ENV')
app = create_app(env_name)
socketio = SocketIO(app)
if __name__ == '__main__':
port = os.getenv('PORT')
# run app
socketio.run(app, host='0.0.0.0', port=port)
我有一个 app.py 文件,用于初始化我的应用程序。我有另一个文件 (run.py),我从中 运行 Flask 服务器。一切都适用于标准的烧瓶应用程序。但是,我正在尝试集成 flask-socketio,它会不断失败并出现不同的错误,具体取决于我尝试初始化应用程序的方式。
我试过以下方法初始化flask-socketio:
socketio = SocketIO(app.config.from_object(app_config[env_name]))
socketio = SocketIO(app, **app.config[env_name])
socketio = SocketIO(**app.config[env_name])
这是我的 app.py 文件中的相关代码。
def create_app(env_name):
"""
Create app
"""
# app initiliazation
app = Flask(__name__)
app.config.from_object(app_config[env_name])
async_mode = None
# initializing bcrypt and db
bcrypt.init_app(app)
db.init_app(app)
socketio = SocketIO(app.config.from_object(app_config[env_name]))
return socketio
我的 run.py 文件如下所示:
rom src.app import create_app
load_dotenv(find_dotenv())
env_name = os.getenv('FLASK_ENV')
app = create_app(env_name)
if __name__ == '__main__':
port = os.getenv('PORT')
# run app
app.run(app, host='0.0.0.0', port=port)
您会注意到我正在从 config.py 文件导入。这就是我的环境变量所在的地方(开发、测试、生产)。每个环境都是它自己的 class。例如:
class Development(object):
"""
Development environment configuration
"""
DEBUG = True
TESTING = False
SQLALCHEMY_TRACK_MODIFICATIONS=False
JWT_SECRET_KEY = os.getenv('JWT_SECRET_KEY')
SQLALCHEMY_DATABASE_URI = os.getenv('DATABASE_URL')
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg', 'gif'])
UPLOADED_FILES_DEST = os.getenv('UPLOADED_FILES_DEST')
如您所见,大部分值都设置在环境变量中,因为将此类敏感信息放入存储库是一种不好的做法。
我希望能够初始化 flask-socketio,这样我就可以设置用户可以共享基于位置的信息的房间。
提前致谢。
Flask-SocketIO 扩展将应用程序实例作为参数。您应该配置应用程序,然后对其进行初始化。例如:
app.config.from_object(app_config[env_name])
socketio = SocketIO(app)
我发现了问题。我无法在 app.py 文件中实例化 SocketIO。我必须从我的 app.py 文件导出应用程序并在我的 run.py 文件中实例化 SocketIO。我的最终代码如下所示:
app.py
def create_app(env_name):
"""
Create app
"""
# app initiliazation
app = Flask(__name__)
app.config.from_object(app_config[env_name])
# initializing bcrypt and db
bcrypt.init_app(app)
db.init_app(app)
return app
最后,我的 run.py 文件看起来像这样。
import os
import logging
from dotenv import load_dotenv, find_dotenv
from flask_socketio import SocketIO, join_room, emit
from src.app import create_app
load_dotenv(find_dotenv())
env_name = os.getenv('FLASK_ENV')
app = create_app(env_name)
socketio = SocketIO(app)
if __name__ == '__main__':
port = os.getenv('PORT')
# run app
socketio.run(app, host='0.0.0.0', port=port)