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
È stato utile?

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 ().

  1. 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
    
  2. 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top