Tengo un alojamiento web Flask sin acceso al cron
comando.
¿Cómo puedo ejecutar alguna función de Python cada hora?
Se puede utilizar BackgroundScheduler()
desde APScheduler paquete (v3.5.3):
import time
import atexit
from apscheduler.schedulers.background import BackgroundScheduler
def print_date_time():
print(time.strftime("%A, %d. %B %Y %I:%M:%S %p"))
scheduler = BackgroundScheduler()
scheduler.add_job(func=print_date_time, trigger="interval", seconds=3)
scheduler.start()
# Shut down the scheduler when exiting the app
atexit.register(lambda: scheduler.shutdown())
Tenga en cuenta que dos de estos programadores se iniciarán cuando Flask esté en modo de depuración. Para obtener más información, consulte esta pregunta.
flask
tuviera unApp.runonce
oApp.runForNseconds
podría cambiar entreschedule
y el corredor de matraces, pero este no es el caso, por lo que la única forma por ahora es usar estoPuede utilizarlo
APScheduler
en su aplicación Flask y ejecutar sus trabajos a través de su interfaz:fuente
lambda
dentroatexit.register
?atexit.register
necesita una función para llamar. Si pasamoscron.shutdown(wait=False)
, estaríamos pasando el resultado de la llamadacron.shutdown
(que probablemente seaNone
). Así que en lugar, se pasa una función sin argumentos, y en lugar de darle un nombre y usando una declaracióndef shutdown(): cron.shutdown(wait=False)
yatexit.register(shutdown)
que en lugar de registrarlo en línea conlambda:
(que es una función sin argumentos expresión .)Soy un poco nuevo con el concepto de programadores de aplicaciones, pero lo que encontré aquí para APScheduler v3.3.1 es algo un poco diferente. Creo que para las versiones más recientes, la estructura del paquete, los nombres de las clases, etc., han cambiado, por lo que estoy poniendo aquí una nueva solución que hice recientemente, integrada con una aplicación básica de Flask:
También dejo este Gist aquí , si alguien tiene interés en las actualizaciones de este ejemplo.
Aquí hay algunas referencias, para lecturas futuras:
fuente
apscheduler.schedulers.background
, ya que es posible que encuentres otros escenarios útiles para tu aplicación. Saludos.Puede intentar usar BackgroundScheduler de APScheduler para integrar el trabajo de intervalo en su aplicación Flask. A continuación se muestra el ejemplo que usa blueprint y app factory ( init .py):
Espero eso ayude :)
Ref .:
fuente
Para una solución simple, puede agregar una ruta como
Luego, agregue un trabajo cron de Unix que se envíe a este punto final periódicamente. Por ejemplo, para ejecutarlo una vez por minuto, en terminal escriba
crontab -e
y agregue esta línea:(Tenga en cuenta que la ruta para curvar debe estar completa, ya que cuando se ejecuta el trabajo no tendrá su RUTA. Puede encontrar la ruta completa para curvar en su sistema
which curl
)Me gusta esto porque es fácil probar el trabajo manualmente, no tiene dependencias adicionales y como no hay nada especial, es fácil de entender.
Seguridad
Si desea proteger con contraseña su trabajo cron, puede
pip install Flask-BasicAuth
hacerlo y luego agregar las credenciales a la configuración de su aplicación:Para proteger con contraseña el punto final del trabajo:
Luego, para llamarlo desde su trabajo cron:
fuente
Otra alternativa podría ser utilizar Flask-APScheduler, que funciona muy bien con Flask, por ejemplo:
Más información aquí:
https://pypi.python.org/pypi/Flask-APScheduler
fuente
Un ejemplo completo que usa programación y multiprocesamiento, con control de encendido y apagado y parámetro para ejecutar_trabajo () los códigos de retorno se simplifican y el intervalo se establece en 10 segundos, cambia a
every(2).hour.do()
por 2 horas. El horario es bastante impresionante, no se desvía y nunca lo he visto más de 100 ms fuera de la programación. Usar multiprocesamiento en lugar de subprocesos porque tiene un método de terminación.Prueba esto simplemente emitiendo:
Cada 10 segundos que el temporizador esté encendido, emitirá un mensaje de temporizador a la consola:
fuente
Es posible que desee utilizar algún mecanismo de cola con un programador como el programador RQ o algo más pesado como Celery (probablemente una exageración).
fuente