Инициализировать приложение Python Flask-SocketIO на героку

Я новичок в python, поэтому это может быть глупый вопрос, но у меня есть следующая проблема:

Я пытаюсь развернуть приложение Flask-SocketIO на героку, мой app.py выглядит так:

app = Flask(__name__)
socketio = SocketIO(app)
opt: Dict[Any, Any] = {}
.
.
@socketio.on('connect')
def joined():
   test = json.dumps(opt)
   emit('test', test)
.
.
if __name__ == '__main__':
   opt = setup_args()
   socketio.run(app)

Мой procfile выглядит так:

web: gunicorn -k flask_sockets.worker app:app

Если я запускаю heroku local, мой сервер запускается, как и ожидалось, и я могу установить соединение сокета с моим клиентом, но моя переменная opt кажется не заполненной. Из того, что я прочитал в документах, это связано с тем, что procfile выполняет socketio.run(app) за меня, а моя __main__ часть не выполняется. Мне нужно каким-то образом вызвать метод, который инициализирует некоторые переменные в моем app.py. Как я могу этого добиться?

Спасибо

Есть ли причина, по которой вы просто не переместите opt = setup_args() из оператора if и не переместите его, скажем, куда-нибудь в начало файла? Потому что это решило бы проблему. Если вы хотите, чтобы opt использовалось для каждого запроса, вы должны использовать объект g.

MacOS 14.12.2020 15:00

ну, это было.. спасибо! Итак, для чего нужен объект g? это установить переменную global перед назначением? Если я правильно понимаю, если я назначаю переменную в области действия функции, она доступна только в этой функции, если я использую global optopt = setup_args(), назначается глобальная переменная opt. это верно?

ping pong 14.12.2020 15:26

Объект g доступен вам по каждому запросу. И другие ваши утверждения кажутся правильными.

MacOS 14.12.2020 15:28

PS: я тоже разместил свой комментарий в качестве ответа. Поэтому, если вы отметите его как правильный ответ и откажетесь от голосования, другим будет легче определить правильный ответ. :)

MacOS 14.12.2020 15:29

Хорошо, у меня есть еще одна проблема: если я попытаюсь что-то изменить в своем opt dict, например: opt['agent'] = xyz, я получаю следующую ошибку: NameError: name 'opt' is not defined Значит, моя переменная не инициализирована, если я не ошибаюсь.

ping pong 14.12.2020 15:36

Да, это так. Как вы сказали ранее, это означает, что переменная opt не определена в вашей области. Однако, если у вас есть другой вопрос, пожалуйста, откройте новый и опубликуйте пример кода соответственно. Иначе другие запутаются.

MacOS 14.12.2020 15:42
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть ли причина, по которой вы просто не переместите opt = setup_args() из оператора if и не переместите его, скажем, куда-нибудь в начало файла?

Другие вопросы по теме