Soy nuevo en Django y frameworks web en general. Tengo una aplicación que está configurada y funciona perfectamente bien en mi servidor local.
El programa utiliza la API de Twitter para recopilar un montón de tweets y mostrarlos al usuario. El único problema es que necesito mi programa python que hace que los tweets se ejecuten en segundo plano de vez en cuando.
Aquí es donde tendría sentido usar el módulo de programación, pero una vez que inicio el servidor local, nunca ejecuta las funciones de programación. Intenté leer sobre cronjobs y parece que no puedo hacerlo funcionar. ¿Cómo puedo hacer que Django ejecute un archivo python específico periódicamente?
Me encontré con una situación similar y tuve mucho éxito con django-apscheduler . Es todo autónomo: se ejecuta con el servidor Django y los trabajos se rastrean en la base de datos Django, por lo que no tiene que configurar ningún trabajo cron externo ni nada para llamar a un script.
A continuación, se muestra una forma básica de comenzar a funcionar rápidamente, pero los enlaces al final de esta publicación tienen mucha más documentación y detalles, así como opciones más avanzadas.
Instale con pip install django-apscheduler luego agréguelo a sus INSTALLED_APPS :
INSTALLED_APPS = [ ... 'django_apscheduler', ... ] Una vez instalado, asegúrese de ejecutar makemigrations y migrate en la base de datos.
Cree un paquete de python del scheduler (una carpeta en el directorio de su aplicación llamada scheduler con un __init__.py en blanco). Luego, allí, cree un archivo llamado scheduler.py , que debería verse así:
from apscheduler.schedulers.background import BackgroundScheduler from django_apscheduler.jobstores import DjangoJobStore, register_events from django.utils import timezone from django_apscheduler.models import DjangoJobExecution import sys # This is the function you want to schedule - add as many as you want and then register them in the start() function below def deactivate_expired_accounts(): today = timezone.now() ... # get accounts, expire them, etc. ... def start(): scheduler = BackgroundScheduler() scheduler.add_jobstore(DjangoJobStore(), "default") # run this job every 24 hours scheduler.add_job(deactivate_expired_accounts, 'interval', hours=24, name='clean_accounts', jobstore='default') register_events(scheduler) scheduler.start() print("Scheduler started...", file=sys.stdout)En su archivo apps.py (créelo si no existe):
from django.apps import AppConfig class AppNameConfig(AppConfig): name = 'your_app_name' def ready(self): from scheduler import scheduler scheduler.start() Una palabra de precaución: cuando use esto con DEBUG = True en su archivo settings.py , ejecute el servidor de desarrollo con el indicador --noreload establecido (es decir python manage.py runserver localhost:8000 --noreload ), de lo contrario, las tareas programadas iniciar y ejecutar dos veces.
Además, django-apscheduler no le permite pasar ningún parámetro a las funciones que están programadas para ejecutarse. Es una limitación, pero nunca he tenido un problema con eso. Puede cargarlos desde alguna fuente externa, como la base de datos Django, si realmente lo necesita.
Puede usar todas las bibliotecas, paquetes y funciones estándar de Django dentro de las tareas apscheduler (funciones). Por ejemplo, para consultar modelos, llamar a API externas, analizar respuestas/datos, etc., etc. Está perfectamente integrado.
Algunos enlaces adicionales:
Otra biblioteca que puedes usar es django-q
Django Q es una cola de tareas, programador y aplicación de trabajo nativa de Django que utiliza el multiprocesamiento de Python. 1
Al igual que django-appscheduler , puede ejecutar y rastrear trabajos usando la base de datos a la que está conectado Django. O bien, puede utilizar corredores completos como Reddis.
El único problema es que necesito mi programa python que hace que los tweets se ejecuten en segundo plano de vez en cuando.
Eso suena como un planificador. (Django-q también tiene una función de tareas, que puede ser activada por eventos en lugar de ejecutarse según un cronograma. El programador simplemente se encuentra encima de la función de tareas y activa tareas en un cronograma definido).
Hay tres partes en esto con django-q:
Instalar django-q
pip install django-q Configúrelo como una aplicación instalada en Django settings.py (agréguelo a la lista de aplicaciones instaladas):
INSTALLED_APPS = [ ... 'django_q', ... ] Luego necesita su propia configuración settings.py (esta es una configuración para usar la base de datos como intermediario en lugar de reddis o algo externo a Django).
# Settings for Django-Q # https://mattsegal.dev/simple-scheduled-tasks.html Q_CLUSTER = { 'orm': 'default', # should use django's ORM and database as a broker. 'workers': 4, 'timeout': 30, 'retry': 60, 'queue_limit': 50, 'bulk': 10, }Luego deberá ejecutar migraciones en la base de datos para crear las tablas que usa django-q:
python manage.py migrate(Esto creará un montón de tablas relacionadas con el cronograma y la tarea en la base de datos. Se pueden ver y manipular a través del panel de administración de Django).
Definir una función de tarea
Luego cree un nuevo archivo para las tareas que desea ejecutar:
# app/tasks.py def fetch_tweets(): pass # do whatever logic you want hereDefinir un programa de tareas
Necesitamos agregar a la base de datos el cronograma para ejecutar las tareas.
python manage.py shell from django_q.models import Schedule Schedule.objects.create( func='app.tasks.fetch_tweets', # module and func to run minutes=5, # run every 5 minutes repeats=-1 # keep repeating, repeat forever )No tienes que hacer esto a través del caparazón. Puede hacer esto en un módulo de código python, etc. Pero probablemente solo necesite crear el cronograma una vez.
Ejecutar el clúster
Una vez que haya terminado, debe ejecutar el clúster que procesará la programación. De lo contrario, sin ejecutar el clúster, la programación y las tareas nunca se procesarán. La llamada a qcluster es una llamada de bloqueo. Entonces, normalmente desea ejecutarlo en una ventana o proceso separado del proceso del servidor Django.
python manage.py qclusterCuando se ejecuta, verá un resultado como:
09:33:00 [Q] INFO Q Cluster fruit-november-wisconsin-hawaii starting. 09:33:00 [Q] INFO Process-1:1 ready for work at 11 09:33:00 [Q] INFO Process-1:2 ready for work at 12 09:33:00 [Q] INFO Process-1:3 ready for work at 13 09:33:00 [Q] INFO Process-1:4 ready for work at 14 09:33:00 [Q] INFO Process-1:5 monitoring at 15 09:33:00 [Q] INFO Process-1 guarding cluster fruit-november-wisconsin-hawaii 09:33:00 [Q] INFO Q Cluster fruit-november-wisconsin-hawaii running.También hay documentación de ejemplo que es bastante útil si desea ver cómo vincular tareas a informes, correos electrónicos, señales, etc.