我无法使用app.from_object参数初始化Flask SocketIO

时间:2019-05-25 00:17:35

标签: flask-socketio

我有一个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 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,以便可以设置用户可以共享基于位置的信息的房间。

谢谢。

2 个答案:

答案 0 :(得分:0)

Flask-SocketIO扩展将应用程序实例作为参数。您应该配置该应用程序,然后对其进行初始化。例如:

app.config.from_object(app_config[env_name])
socketio = SocketIO(app)

答案 1 :(得分:0)

我发现了问题。我无法在我的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)