Comando personalizzato e cronologia di Django
-
05-07-2019 - |
Domanda
Voglio che il mio comando Django personalizzato venga eseguito ogni minuto. Tuttavia sembra che python /path/to/project/myapp/manage.py mycommand
non sembra funzionare mentre nella directory python manage.py mycommand
funziona perfettamente.
Come posso raggiungere questo obiettivo? Uso / etc / crontab
con:
****** root python /path/to/project/myapp/manage.py mycommand
Soluzione
Penso che il problema sia che cron eseguirà i tuoi script in un " bare " ambiente, quindi il tuo DJANGO_SETTINGS_MODULE è probabilmente non definito. Potresti volerlo riassumere in uno script di shell che prima definisce DJANGO_SETTINGS_MODULE
Qualcosa del genere:
#!/bin/bash
export DJANGO_SETTINGS_MODULE=myproject.settings
./manage.py mycommand
Renderlo eseguibile (chmod + x) e quindi impostare cron per eseguire invece lo script.
Modifica
Volevo anche dire che puoi " modularizzare " questo concetto un po 'e rendilo tale che il tuo script accetti i comandi di gestione come argomenti.
#!/bin/bash
export DJANGO_SETTINGS_MODULE=myproject.settings
./manage.py ${*}
Ora, il tuo lavoro cron può semplicemente passare " mycommand " o qualsiasi altro comando manage.py che desideri eseguire da un processo cron.
Altri suggerimenti
cd /path/to/project/myapp && python manage.py mycommand
Concatenando i comandi in questo modo, python non verrà eseguito a meno che cd non cambi correttamente la directory.
Se vuoi che la tua vita in Django sia molto più semplice, usa django-command-extensions nel tuo progetto:
http://code.google.com/p/django-command-extensions /
Troverai un comando chiamato " runscript " quindi aggiungi semplicemente il comando alla tua linea crontab:
****** root python /path/to/project/myapp/manage.py runscript mycommand
E un tale script verrà eseguito con l'ambiente di contesto Django.
Questo è ciò che ho fatto di recente in uno dei miei progetti (mantengo i venv per ogni progetto che lavoro, quindi presumo che tu abbia venvs)
***** /path/to/venvs/bin/python /path/to/app/manage.py command_name
Questo ha funzionato perfettamente per me.
L'estensione del runscript non era ben documentata. A differenza del comando django, questo può andare ovunque nel progetto e richiede una cartella di script. Il file .py richiede una funzione run ().
-
Se è uno script autonomo, devi farlo:
from django.conf import settings from django.core.management import setup_environ setup_environ(settings) #your code here which uses django code, like django model
-
Se è un comando django, è più facile: https://coderwall.com/p/k5p6ag
In (management / command / exporter.py)
from django.core.management.base import BaseCommand, CommandError class Command(BaseCommand): args = '' help = 'Export data to remote server' def handle(self, *args, **options): # do something here
E poi, nella riga di comando:
$ python manage.py exporter
Ora, è facile aggiungere una nuova attività cron a un sistema Linux, usando crontab:
$ crontab -e
or $ sudo crontab -e if you need root privileges
Nel file crontab, ad esempio per eseguire questo comando ogni 15 minuti, qualcosa del genere:
# m h dom mon dow command
*/15 * * * * python /var/www/myapp/manage.py exporter