как manage.py может начать итерацию flask - PullRequest
0 голосов
/ 01 августа 2020

Я делаю трекер цен. Моя структура проекта такова:

Myapp-folder     
    manage.py-from flask script module     
    subApp-folder
        __init__.py 
        form.py 
        models.py 
        views.py 
        pricemonitor-folder 
            main.py    
            __init__.py 
            send_email.py 
            price_compare_sendemail.py-with class Compare_sendemail and start_monitor function
        

В main.py у меня есть намерение сравнивать цены каждые 60 секунд и при необходимости отправлять электронную почту.

from app.PriceMonitor.price_compare_sendmail import Compare_sendemail
break_time = 60  # set waiting time for one crawl round
monitor = Compare_sendemail()
monitor.start_monitor(break_time)

Manage.py выглядит следующим образом:

from flask_script import Manager, Server
from app import app, db
manager = Manager(app)
manager.add_command("runserver",Server(host='127.0.0.1', port=5000, use_debugger=True))
if __name__ == '__main__':
    manager.run()

Но итерация не работает, когда я запускаю python manage.py runserver, в то время как я напрямую запускаю main.py успешно. Как я могу создать код для запуска сервера flask с итерацией compare_sendemail, работающей в фоновом режиме? Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 августа 2020

Я отвечаю на часть своего вопроса. В main.py я использовал while l oop и модуль времени для итерации price_compare_sendemail.py каждые 60 секунд. Хотя это не идеальный обработчик фоновых задач, в настоящее время этот проект предназначен только для моего личного использования, так что для меня он подходит. Моя первоначальная мысль заключалась в использовании диспетчера сценариев flask для обработки всех команд python - хотя я не знаю, правильная ли это мысль, потому что я только начал изучать Flask. После некоторого поиска в Google я нашел способ использовать менеджер.

from subapp.pricemonitor.main import Start_monitor
Monitor=Start_monitor()
@manager.command
def monitor_start():
    break_time=10
    Monitor.start_monitoring(break_time)

Затем используйте команду 'python manage.py monitor_start', чтобы запустить фоновую задачу. Не знаю, полезно ли это, но, по крайней мере, это соответствовало моей первоначальной мысли.

0 голосов
/ 01 августа 2020

Я думаю, вы ищете Celery. вы можете использовать Фоновую задачу Celery . Если у вашего приложения есть длительная задача, такая как обработка некоторых загруженных данных или отправка электронной почты, вы не хотите ждать, пока она завершит sh во время запроса. Вместо этого используйте очередь задач, чтобы отправить необходимые данные другому процессу, который будет запускать задачу в фоновом режиме, в то время как запрос возвращается немедленно.

здесь вы можете найти документацию для сельдерея https://flask.palletsprojects.com/en/1.1.x/patterns/celery/

, и если вы хотите дождаться завершения задачи, вы можете использовать сопрограммы и задачи

https://docs.python.org/3/library/asyncio-task.html

есть другие варианты для flask фоновая задача, например

RQ https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-xxii-background-jobs

некоторые другие альтернативы https://smirnov-am.github.io/background-jobs-with-flask/

Threads

uWSGI thread

uWSGI spooler uSWGI spooler отлично подходит для простых задач. как отправка OTP SMS или электронной почты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...