587 Stimmen

Einen geplanten Auftrag einrichten?

Ich habe an einer Webanwendung mit Django gearbeitet, und ich bin neugierig, ob es eine Möglichkeit gibt, einen Job zu planen, der regelmäßig ausgeführt wird.

Im Grunde möchte ich nur durch die Datenbank laufen und einige Berechnungen/Aktualisierungen auf einer automatischen, regelmäßigen Basis machen, aber ich kann nicht scheinen, um jede Dokumentation zu finden, dies zu tun.

Weiß jemand, wie man das einrichtet?

Zur Klarstellung: Ich weiß, dass ich eine cron Job, dies zu tun, aber ich bin neugierig, wenn es eine Funktion in Django, die diese Funktionalität bietet. Ich möchte, dass die Leute in der Lage sein, diese Anwendung selbst bereitstellen, ohne viel zu konfigurieren (vorzugsweise Null).

Ich habe in Erwägung gezogen, diese Aktionen "rückwirkend" auszulösen, indem ich einfach prüfe, ob ein Auftrag seit dem letzten Mal, als eine Anfrage an die Website gesendet wurde, ausgeführt werden sollte, aber ich hoffe auf eine etwas sauberere Lösung.

8voto

Van Gale Punkte 42727

Ich persönlich verwende cron, aber die Planung von Aufträgen Teile von django-erweiterungen sieht interessant aus.

6voto

Michael Punkte 2556

Ich habe gerade über diese recht einfache Lösung nachgedacht:

  1. Definieren Sie eine Ansichtsfunktion do_work(req, param) wie bei jeder anderen Ansicht, mit URL-Zuordnung, Rückgabe einer HttpResponse und so weiter.
  2. Richten Sie einen Cron-Job mit Ihren Zeiteinstellungen ein (oder verwenden Sie AT oder Geplante Aufgaben in Windows), der Folgendes ausführt locken. http://localhost/your/mapped/url?param=value .

Sie können Parameter hinzufügen, aber nur Parameter zur URL hinzufügen.

Sagt mir, was ihr davon haltet.

[Update] Ich verwende jetzt den Befehl runjob von django-erweiterungen anstelle von curl.

Mein Cron sieht in etwa so aus:

@hourly python /path/to/project/manage.py runjobs hourly

... und so weiter für täglich, monatlich, usw. Sie können es auch so einrichten, dass ein bestimmter Auftrag ausgeführt wird.

Ich finde es überschaubarer und sauberer. Es ist nicht erforderlich, eine URL einer Ansicht zuzuordnen. Definieren Sie einfach Ihre Auftragsklasse und Crontab und Sie sind bereit.

6voto

Matt McCormick Punkte 12723

Fügen Sie das Folgende am Anfang Ihrer cron.py-Datei ein:

#!/usr/bin/python
import os, sys
sys.path.append('/path/to/') # the parent directory of the project
sys.path.append('/path/to/project') # these lines only needed if not on path
os.environ['DJANGO_SETTINGS_MODULE'] = 'myproj.settings'

# imports and code below

4voto

xiaohei Punkte 41

Nach dem Teil des Codes kann ich alles schreiben, genau wie meine views.py :)

#######################################
import os,sys
sys.path.append('/home/administrator/development/store')
os.environ['DJANGO_SETTINGS_MODULE']='store.settings'
from django.core.management impor setup_environ
from store import settings
setup_environ(settings)
#######################################

von http://www.cotellese.net/2007/09/27/running-external-scripts-against-django-models/

4voto

saran3h Punkte 10035

Sie sollten sich unbedingt django-q ansehen! Es erfordert keine zusätzliche Konfiguration und hat wahrscheinlich alles, was man braucht, um Produktionsprobleme bei kommerziellen Projekten zu lösen.

Es wird aktiv entwickelt und integriert sich sehr gut mit django, django ORM, mongo, redis. Hier ist meine Konfiguration:

# django-q
# -------------------------------------------------------------------------
# See: http://django-q.readthedocs.io/en/latest/configure.html
Q_CLUSTER = {
    # Match recommended settings from docs.
    'name': 'DjangoORM',
    'workers': 4,
    'queue_limit': 50,
    'bulk': 10,
    'orm': 'default',

# Custom Settings
# ---------------
# Limit the amount of successful tasks saved to Django.
'save_limit': 10000,

# See https://github.com/Koed00/django-q/issues/110.
'catch_up': False,

# Number of seconds a worker can spend on a task before it's terminated.
'timeout': 60 * 5,

# Number of seconds a broker will wait for a cluster to finish a task before presenting it again. This needs to be
# longer than `timeout`, otherwise the same task will be processed multiple times.
'retry': 60 * 6,

# Whether to force all async() calls to be run with sync=True (making them synchronous).
'sync': False,

# Redirect worker exceptions directly to Sentry error reporter.
'error_reporter': {
    'sentry': RAVEN_CONFIG,
},
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X