Подтвердить что ты не робот

Какой правильный подход для вызова функций после флеш-приложения запущен?

Я немного смущен тем, как сделать что-то, что, по моему мнению, будет довольно простым. У меня есть простое приложение, написанное с помощью Flask. Это выглядит примерно так:

from flask import Flask

app = Flask(__name__)

def _run_on_start(a_string):
    print "doing something important with %s" % a_string

@app.route('/')
def root():
    return 'hello world'

if __name__ == "__main__":
    if len(sys.argv) < 2:
        raise Exception("Must provide domain for application execution.")
    else:
        DOM = sys.argv[1]
        _run_on_start("%s" % DOM)
        app.run(debug=True)

То, что я нахожу, это то, что мой терминал выводит операторы печати в _run_on_start, но не другой обычный код отладки приложения Flask. Если я удалю вызов перед app.run, выход будет нормальным. Далее я обнаруживаю, что вывод _run_on_start повторяется дважды при запуске, хотя я не знаю, был ли он каким-то странным выходом или функция фактически вызывается дважды.

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

Кроме того, я понимаю, что если я выложу этот модуль из другого модуля, то есть не когда __name__ != "__main__" мой, я не получу свой вызов _run_on_start.

Какой правильный подход здесь? В обоих случаях, когда я начинаю с CL и с другого модуля?

4b9b3361

Ответ 1

Двойной вывод из вашей функции можно объяснить перегрузчиком. Первое, что он делает, это запустить основную функцию в новом потоке, чтобы он мог контролировать исходные файлы и перезапускать поток при их изменении. Отключите это с помощью параметра use_reloader=False.

Если вы хотите иметь возможность запускать вашу функцию при запуске сервера из другого модуля, оберните его в функцию и вызовите эту функцию из другого модуля:

def run_server(dom):
        _run_on_start("%s" % dom)
        app.run(debug=True, use_reloader=False)

if __name__ == '__main__':
    if len(sys.argv) < 2:
        raise Exception("Must provide domain for application execution.")
    else:
        DOM = sys.argv[1]
        run_server(DOM)

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

Ответ 2

Возможно, вы искали декоратор Flask.before_first_request, как в:

@app.before_first_request
def _run_on_start(a_string):
    print "doing something important with %s" % a_string