He estado trabajando en una aplicación web con Django, y tengo curiosidad por saber si hay una manera de programar un trabajo para que se ejecute periódicamente.
Básicamente, solo quiero ejecutar la base de datos y hacer algunos cálculos / actualizaciones de forma automática y regular, pero parece que no puedo encontrar ninguna documentación sobre esto.
¿Alguien sabe cómo configurar esto?
Para aclarar: sé que puedo configurar un cron
trabajo para hacer esto, pero tengo curiosidad por saber si hay alguna característica en Django que brinde esta funcionalidad. Me gustaría que las personas puedan implementar esta aplicación ellos mismos sin tener que hacer mucha configuración (preferiblemente cero).
He considerado activar estas acciones "retroactivamente" simplemente comprobando si un trabajo debería haberse ejecutado desde la última vez que se envió una solicitud al sitio, pero espero algo un poco más limpio.
Respuestas:
Una solución que he empleado es hacer esto:
1) Crear un comando de gestión personalizado , por ejemplo
2) Usar
cron
(en Linux) oat
(en Windows) para ejecutar mi comando en los momentos requeridos.Esta es una solución simple que no requiere instalar una pila AMQP pesada. Sin embargo, hay buenas ventajas de usar algo como el apio, mencionado en las otras respuestas. En particular, con Celery es bueno no tener que distribuir la lógica de su aplicación en archivos crontab. Sin embargo, la solución cron funciona bastante bien para una aplicación de tamaño pequeño a mediano y donde no desea muchas dependencias externas.
EDITAR:
En una versión posterior de Windows, el
at
comando está en desuso para Windows 8, Server 2012 y superior. Puedes usarschtasks.exe
para el mismo uso.**** ACTUALIZACIÓN **** Este es el nuevo enlace de django doc para escribir el comando de gestión personalizado
fuente
python manage.py runcrons
que se ejecute y luego ejecute todos los cron que haya definido y registrado.El apio es una cola de tareas distribuida, construida sobre AMQP (RabbitMQ). También maneja tareas periódicas de forma cron (ver tareas periódicas ). Dependiendo de su aplicación, puede valer la pena un vistazo.
El apio es bastante fácil de configurar con django ( docs ), y las tareas periódicas omitirán las tareas perdidas en caso de un tiempo de inactividad. El apio también tiene mecanismos de reintento integrados, en caso de que una tarea falle.
fuente
Hemos abierto lo que creo que es una aplicación estructurada. que la solución de Brian anterior también alude. ¡Nos encantaría cualquier / todos los comentarios!
https://github.com/tivix/django-cron
Viene con un comando de gestión:
Eso hace el trabajo. Cada cron se modela como una clase (por lo que es todo OO) y cada cron se ejecuta a una frecuencia diferente y nos aseguramos de que el mismo tipo de cron no se ejecute en paralelo (¡en caso de que los crons tarden más tiempo en ejecutarse que su frecuencia!)
fuente
at
o fue diseñado específicamente para funcionarcron
?Si está utilizando un sistema operativo POSIX estándar, utiliza cron .
Si usa Windows, lo usa en .
Escriba un comando de administración de Django para
Averigua en qué plataforma están.
Ejecute el comando "AT" apropiado para sus usuarios o actualice el crontab para sus usuarios.
fuente
Nueva e interesante aplicación Django enchufable: django-chronograph
Solo tiene que agregar una entrada cron que actúe como temporizador, y tiene una interfaz de administrador Django muy agradable en los scripts para ejecutar.
fuente
Mire Drongo Poor Man's Cron, que es una aplicación de Django que utiliza spambots, robots de indexación de motores de búsqueda y similares para ejecutar tareas programadas en intervalos aproximadamente regulares
Ver: http://code.google.com/p/django-poormanscron/
fuente
Hace un tiempo tuve exactamente el mismo requisito y terminé resolviéndolo usando APScheduler ( Guía del usuario )
Hace que los trabajos de programación sean súper simples y lo mantiene independiente de la ejecución de algún código basada en solicitudes. El siguiente es un ejemplo simple.
Espero que esto ayude a alguien!
fuente
La sugerencia de Brian Neal de ejecutar comandos de administración a través de cron funciona bien, pero si está buscando algo un poco más robusto (pero no tan elaborado como Celery), buscaría en una biblioteca como Kronos :
fuente
RabbitMQ y Celery tienen más características y capacidades de manejo de tareas que Cron. Si la falla de la tarea no es un problema y cree que manejará las tareas interrumpidas en la próxima llamada, entonces Cron es suficiente.
Celery & AMQP le permitirá manejar la tarea rota, y será ejecutada nuevamente por otro trabajador (los trabajadores de Celery escuchan la próxima tarea para trabajar), hasta que
max_retries
se alcance el atributo de la tarea . Incluso puede invocar tareas en caso de error, como registrar el error o enviar un correo electrónico al administrador una vez quemax_retries
se haya alcanzado.Y puede distribuir servidores Celery y AMQP cuando necesite escalar su aplicación.
fuente
Personalmente uso cron, pero las partes de Programación de trabajos de django-extensiones parecen interesantes.
fuente
Aunque no es parte de Django, Airflow es un proyecto más reciente (a partir de 2016) que es útil para la gestión de tareas.
Airflow es un sistema de programación y automatización de flujo de trabajo que se puede utilizar para crear y administrar canalizaciones de datos. Una interfaz de usuario basada en web proporciona al desarrollador una gama de opciones para administrar y ver estas canalizaciones.
Airflow está escrito en Python y está construido usando Flask.
Airflow fue creado por Maxime Beauchemin en Airbnb y de código abierto en la primavera de 2015. Se unió al programa de incubación de Apache Software Foundation en el invierno de 2016. Aquí está la página del proyecto Git y alguna información adicional .
fuente
Coloque lo siguiente en la parte superior de su archivo cron.py:
fuente
Acabo de pensar en esta solución bastante simple:
Puede agregar parámetros pero solo agregar parámetros a la URL.
Dime que piensan ustedes.
[Actualización] Ahora estoy usando el comando runjob de django-extensions lugar de curl.
Mi cron se parece a esto:
... y así sucesivamente para diario, mensual, etc. También puede configurarlo para ejecutar un trabajo específico.
Lo encuentro más manejable y más limpio. No requiere asignar una URL a una vista. Simplemente defina su clase de trabajo y crontab y estará listo.
fuente
después de la parte del código, puedo escribir cualquier cosa como mi views.py :)
de http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/
fuente
Definitivamente deberías revisar django-q! No requiere configuración adicional y posiblemente tiene todo lo necesario para manejar cualquier problema de producción en proyectos comerciales.
Se ha desarrollado activamente y se integra muy bien con django, django ORM, mongo, redis. Aquí está mi configuración:
fuente
Django APScheduler para trabajos de planificador. Advanced Python Scheduler (APScheduler) es una biblioteca de Python que le permite programar su código de Python para que se ejecute más tarde, ya sea solo una vez o periódicamente. Puede agregar nuevos trabajos o eliminar los antiguos sobre la marcha, según lo desee.
nota: soy el autor de esta biblioteca
Instalar APScheduler
Ver función de archivo para llamar
nombre del archivo: Scheduler_jobs.py
Configurar el planificador
crea el archivo execute.py y agrega los siguientes códigos
Sus funciones escritas Aquí, las funciones del planificador están escritas en Scheduler_jobs
Enlace el archivo para su ejecución
Ahora, agregue la línea a continuación en la parte inferior del archivo Url
fuente
Tuve algo similar con tu problema hoy.
No quería que el servidor lo manejara a través de cron (y la mayoría de las librerías solo eran ayudantes de cron al final).
Así que creé un módulo de programación y lo adjunté al init .
No es el mejor enfoque, pero me ayuda a tener todo el código en un solo lugar y con su ejecución relacionada con la aplicación principal.
fuente
Sí, el método anterior es muy bueno. Y probé algunos de ellos. Por fin, encontré un método como este:
Justo como recursivo .
Ok, espero que este método pueda cumplir con sus requisitos. :)
fuente
Una solución más moderna (en comparación con el apio) es Django Q: https://django-q.readthedocs.io/en/latest/index.html
Tiene una excelente documentación y es fácil de asimilar. Falta el soporte de Windows, porque Windows no admite la bifurcación del proceso. Pero funciona bien si crea su entorno de desarrollo utilizando Windows para Linux Subsystem.
fuente
Yo uso el apio para crear mis tareas periódicas. Primero debe instalarlo de la siguiente manera:
No olvide registrarse
django-celery
en su configuración y luego podría hacer algo como esto:fuente
No estoy seguro de que esto sea útil para nadie, ya que tuve que proporcionar a otros usuarios del sistema para programar los trabajos, sin darles acceso al Programador de tareas del servidor (Windows) real, creé esta aplicación reutilizable.
Tenga en cuenta que los usuarios tienen acceso a una carpeta compartida en el servidor donde pueden crear el archivo de comando / tarea / .bat requerido. Esta tarea se puede programar con esta aplicación.
El nombre de la aplicación es Django_Windows_Scheduler
Captura de pantalla:
fuente
Si desea algo más confiable que Celery , pruebe TaskHawk, que se basa en AWS SQS / SNS .
Consulte: http://taskhawk.readthedocs.io
fuente
Para proyectos dockerizados simples, realmente no podía ver ningún ajuste de respuesta existente.
Así que escribí una solución muy básica sin la necesidad de bibliotecas externas o desencadenantes, que se ejecuta por sí sola. No se necesita un os-cron externo, debería funcionar en todos los entornos.
Funciona agregando un middleware:
middleware.py
models/cron.py
:settings.py
:fuente
Una manera simple es escribir un comando de shell personalizado, ver la documentación de Django y ejecutarlo usando un cronjob en Linux. Sin embargo, recomendaría usar un agente de mensajes como RabbitMQ junto con apio. Tal vez puedas echar un vistazo a este tutorial
fuente