Frage

Ich möchte meine benutzerdefinierte Django Befehl aus, um jede Minute ausgeführt werden. Allerdings scheint es, wie python /path/to/project/myapp/manage.py mycommand nicht zu funktionieren scheint, während im Verzeichnis python manage.py mycommand perfekt funktioniert.

Wie kann ich das erreichen? Ich benutze /etc/crontab mit:

****** root python /path/to/project/myapp/manage.py mycommand
War es hilfreich?

Lösung

Ich denke, das Problem ist, dass cron Ihre Skripte in einer „nackten“ -Umgebung wird ausgeführt, so dass Ihre DJANGO_SETTINGS_MODULE wahrscheinlich nicht definiert ist. Sie können sie in einem Shell-Skript einpacken, die zuerst DJANGO_SETTINGS_MODULE definiert

So etwas wie folgt aus:

#!/bin/bash

export DJANGO_SETTINGS_MODULE=myproject.settings 
./manage.py mycommand

Machen Sie es ausführbar (chmod + x) und dann cron einrichten, anstatt das Skript auszuführen.

Bearbeiten

Ich wollte auch sagen, dass Sie „modularisieren“ dieses Konzept ein wenig und machen es so, dass das Skript die Befehle als Argumente verwalten akzeptiert.

#!/bin/bash

export DJANGO_SETTINGS_MODULE=myproject.settings
./manage.py ${*}

Nun, Ihr Cron-Job kann einfach passieren „mycommand“ oder anderen manage.py Befehl, den Sie von einem cron-Job ausgeführt werden sollen.

Andere Tipps

cd /path/to/project/myapp && python manage.py mycommand

Durch Ihre Befehle wie diese Verkettung, Python wird nicht ausgeführt, es sei denn, cd das Verzeichnis nicht verändert.

Wenn Sie Ihr Leben Django wollen, viel einfacher django-Befehlserweiterungen innerhalb Ihres Projekts verwenden:

http://code.google.com/p/django-command-extensions /

Sie werden einen Befehl finden namens „runscript“, so dass Sie einfach den Befehl crontab Zeile hinzu:

****** root python /path/to/project/myapp/manage.py runscript mycommand

Und ein solches Skript wird mit dem Kontextumgebung Django auszuführen.

Das ist, was ich in einem meiner Projekte vor kurzem getan haben, (i halten VENVS für jedes Projekt ich arbeite, also bin ich assumning Sie haben VENVS)

 ***** /path/to/venvs/bin/python /path/to/app/manage.py command_name

Das funktioniert perfekt für mich.

Die runscript Erweiterung war nicht gut dokumentiert. Im Gegensatz zu den django Befehl kann dies ein gehen überall in Ihrem Projekt und erfordert einen Skriptordner. Die Py-Datei erfordert eine Funktion run ().

  1. Wenn sie ein eigenständiges Skript, müssen Sie dies tun:

    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. Wenn ihr ein django Befehl, seine einfacher: https://coderwall.com/p/k5p6ag

    (Management / Befehle / 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
    

Und dann in der Befehlszeile:

$ python manage.py exporter

Jetzt ist es einfach, eine neue Crontask auf ein Linux-System hinzuzufügen, crontab:

$ crontab -e

or $ sudo crontab -e if you need root privileges

In der crontab-Datei, zum Beispiel für die Lauf dieser Befehl alle 15 Minuten, so etwas wie folgt aus:

# m h  dom mon dow   command
*/15 * * * * python /var/www/myapp/manage.py exporter
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top