Я новичок в 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.
Как я могу этого добиться?
Спасибо
ну, это было.. спасибо! Итак, для чего нужен объект g? это установить переменную global
перед назначением? Если я правильно понимаю, если я назначаю переменную в области действия функции, она доступна только в этой функции, если я использую global opt
opt = setup_args()
, назначается глобальная переменная opt
. это верно?
Объект g
доступен вам по каждому запросу. И другие ваши утверждения кажутся правильными.
PS: я тоже разместил свой комментарий в качестве ответа. Поэтому, если вы отметите его как правильный ответ и откажетесь от голосования, другим будет легче определить правильный ответ. :)
Хорошо, у меня есть еще одна проблема: если я попытаюсь что-то изменить в своем opt dict, например: opt['agent'] = xyz
, я получаю следующую ошибку: NameError: name 'opt' is not defined
Значит, моя переменная не инициализирована, если я не ошибаюсь.
Да, это так. Как вы сказали ранее, это означает, что переменная opt
не определена в вашей области. Однако, если у вас есть другой вопрос, пожалуйста, откройте новый и опубликуйте пример кода соответственно. Иначе другие запутаются.
Есть ли причина, по которой вы просто не переместите opt = setup_args()
из оператора if и не переместите его, скажем, куда-нибудь в начало файла?
Есть ли причина, по которой вы просто не переместите
opt = setup_args()
из оператора if и не переместите его, скажем, куда-нибудь в начало файла? Потому что это решило бы проблему. Если вы хотите, чтобыopt
использовалось для каждого запроса, вы должны использовать объектg
.