Я не могу инициализировать Flask SocketIO с параметром app.from_object - PullRequest
0 голосов
/ 25 мая 2019

У меня есть файл app.py, где я инициализирую свое приложение.У меня есть другой файл (run.py), откуда я запускаю сервер Flask.Все работает со стандартным приложением колбы.Однако я пытаюсь интегрировать флешку-сокето, и она продолжает давать сбой с разными ошибками в зависимости от того, как я пытаюсь инициализировать приложение.

Я пробовал следующие способы инициализации флеш-сокета:

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.Вот где мои переменные окружения для (dev, test, prod).Каждая среда - это свой класс.Например:

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')

Как вы можете видеть, большинство из этих значений задаются в переменной среды, поскольку не рекомендуется помещать такую ​​чувствительную информацию в репозиторий.

Я бы хотелчтобы иметь возможность инициализировать колбу, чтобы я мог настроить комнаты, где пользователи могут обмениваться информацией о местоположении.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Я нашел проблему. Я не могу создать экземпляр SocketIO в моем файле app.py. Я должен экспортировать приложение из моего файла app.py и создать экземпляр SocketIO в моем файле run.py. Мой окончательный код выглядит так:

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)
0 голосов
/ 26 мая 2019

Расширения Flask-SocketIO принимают экземпляр приложения в качестве аргумента.Вы должны настроить приложение и затем инициализировать его.Например:

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