563

私は Django を使用して Web アプリに取り組んできましたが、ジョブを定期的に実行するようにスケジュールする方法があるかどうか知りたいです。

基本的に、データベースを実行して、定期的に自動で計算/更新を行いたいだけですが、これに関するドキュメントが見つからないようです。

これを設定する方法を知っている人はいますか?

明確にするために:これを行うためのジョブを設定できることは知ってcronいますが、この機能を提供する機能がDjangoにあるかどうか知りたいです。多くの構成を行う必要なく (できればゼロで)、このアプリを自分でデプロイできるようにしてほしいと思います。

前回リクエストがサイトに送信されてからジョブが実行されているかどうかを確認するだけで、これらのアクションを「さかのぼって」トリガーすることを検討しましたが、もう少しクリーンなものを望んでいます。

4

24 に答える 24

393

私が採用した1つの解決策は、これを行うことです:

1)カスタム管理コマンドを作成します。

python manage.py my_cool_command

2) cron(Linux の場合) またはat(Windows の場合) を使用して、必要な時間にコマンドを実行します。

これは、重い AMQP スタックをインストールする必要のないシンプルなソリューションです。ただし、他の回答で言及されているセロリのようなものを使用することには、優れた利点があります。特に、Celery を使用すると、アプリケーションのロジックを crontab ファイルに分散する必要がなくなります。ただし、cron ソリューションは、小規模から中規模のアプリケーションで、多くの外部依存関係を必要としない場合に非常にうまく機能します。

編集:

それ以降のバージョンの Windows では、このatコマンドは Windows 8、Server 2012 以降では非推奨です。そのままの用途でご利用いただけますschtasks.exe

**** 更新 **** これは、カスタム管理コマンドを記述するための django docの新しいリンクです。

于 2009-02-21T20:06:38.010 に答える
166

Celeryは、AMQP(RabbitMQ)上に構築された分散タスクキューです。また、cronのような方法で定期的なタスクを処理します(定期的なタスクを参照)。アプリによっては、一見の価値があるかもしれません。

Celeryはdjango( docs )を使用してセットアップするのは非常に簡単であり、定期的なタスクは、ダウンタイムが発生した場合に、実際には失敗したタスクをスキップします。Celeryには、タスクが失敗した場合に備えて、再試行メカニズムも組み込まれています。

于 2009-06-29T11:56:47.943 に答える
54

構造化アプリと思われるものをオープンソース化しました。上記のブライアンのソリューションも暗示しています。あらゆる/すべてのフィードバックをお待ちしております!

https://github.com/tivix/django-cron

1 つの管理コマンドが付属しています。

./manage.py runcrons

それは仕事をします。各 cron はクラスとしてモデル化され (つまり、すべて OO)、各 cron は異なる頻度で実行され、同じ cron タイプが並行して実行されないようにします (cron 自体の実行に頻度よりも長い時間がかかる場合に備えて!)

于 2012-01-30T21:47:06.483 に答える
38

標準の POSIX OS を使用している場合は、cronを使用します。

Windows を使用している場合は、 atを使用します。

Django 管理コマンドを

  1. 彼らがどのプラットフォーム上にいるかを把握します。

  2. ユーザーに対して適切な「AT」コマンドを実行するか、ユーザーcrontab を更新します。

于 2009-02-21T20:04:40.260 に答える
23

興味深い新しいプラグ可能な Django アプリ: django-chronograph

タイマーとして機能する 1 つの cron エントリを追加するだけで、実行するスクリプトに非常に優れた Django 管理インターフェイスを使用できます。

于 2009-03-07T08:32:30.637 に答える
16

Django Poor Man's Cron を見てください。これは、スパムボット、検索エンジンのインデックス作成ロボットなどを利用して、スケジュールされたタスクをほぼ定期的に実行する Django アプリです。

参照: http://code.google.com/p/django-poormanscron/

于 2009-02-21T20:29:47.643 に答える
10

cron を介して管理コマンドを実行するという Brian Neal の提案はうまく機能しますが、もう少し堅牢なもの (まだ Celery ほど精巧ではない) を探している場合は、Kronosのようなライブラリを調べます。

# app/cron.py

import kronos

@kronos.register('0 * * * *')
def task():
    pass
于 2011-12-20T12:30:42.837 に答える
9

RabbitMQ と Celery には、Cron よりも多くの機能とタスク処理機能があります。タスクの失敗が問題ではなく、次の呼び出しで壊れたタスクを処理すると思われる場合は、Cron で十分です。

Celery とAMQPmax_retriesを使用すると、壊れたタスクを処理でき、タスクの属性に到達するまで、別のワーカーによって再度実行されます (Celery ワーカーは次のタスクをリッスンします) 。max_retries失敗をログに記録したり、到達したら管理者にメールを送信したりするなど、失敗時にタスクを呼び出すこともできます。

また、アプリケーションをスケーリングする必要がある場合は、Celery サーバーと AMQP サーバーを配布できます。

于 2012-04-03T14:54:18.513 に答える
8

個人的にはcronを使っていますが、django-extensionsのJobs Scheduling部分が面白そうです。

于 2009-02-22T03:18:07.553 に答える
7

Django の一部ではありませんが、Airflowはタスク管理に役立つ最近のプロジェクト (2016 年現在) です。

Airflow は、データ パイプラインの作成と管理に使用できるワークフロー自動化およびスケジューリング システムです。Web ベースの UI は、これらのパイプラインを管理および表示するためのさまざまなオプションを開発者に提供します。

Airflow は Python で記述され、Flask を使用して構築されています。

Airflow は Airbnb の Maxime Beauchemin によって作成され、2015 年の春にオープン ソース化されました。2016 年の冬に Apache Software Foundation のインキュベーション プログラムに参加しました。Git プロジェクト ページと追加の背景情報を次に示します。

于 2016-07-19T20:49:43.057 に答える
6

私はこのかなり単純な解決策について考えました:

  1. 他のビューと同じようにビュー関数do_work(req、param)を定義し、URLマッピングを使用して、HttpResponseを返します。
  2. curl http:// localhost / your / mapped / url?param = valueを実行するタイミング設定(またはWindowsのATまたはスケジュールされたタスクを使用)でcronジョブを設定します。

パラメータを追加できますが、URLにパラメータを追加するだけです。

皆さんの考えを教えてください。

[更新] curlの代わりにdjango-extensionsのrunjobコマンドを使用しています。

私のcronは次のようになります。

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

...毎日、毎月など。特定のジョブを実行するように設定することもできます。

私はそれがより扱いやすく、よりきれいだと思います。URLをビューにマッピングする必要はありません。ジョブクラスとcrontabを定義するだけで、設定が完了します。

于 2011-10-30T13:19:58.790 に答える
6

cron.py ファイルの先頭に次を追加します。

#!/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
于 2010-01-07T23:26:10.873 に答える
4

コードの一部の後に、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)
#######################################

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

于 2011-05-17T03:09:13.127 に答える
3

(Celery と比較して) より最新のソリューションは Django Q です: https://django-q.readthedocs.io/en/latest/index.html

優れたドキュメントがあり、簡単に理解できます。Windows はプロセスの分岐をサポートしていないため、Windows のサポートが不足しています。ただし、Windows for Linux サブシステムを使用して開発環境を作成すると、問題なく動作します。

于 2017-11-11T16:38:15.553 に答える
2

今日、あなたの問題に似たことがありました。

サーバーがcronを介して処理することは望んでいませんでした(そして、ほとんどのライブラリは最終的に単なるcronヘルパーでした)。

だから私はスケジューリングモジュールを作成し、それをinitにアタッチしました。

これは最善の方法ではありませんが、すべてのコードを 1 か所にまとめ、その実行をメイン アプリに関連付けることができます。

于 2011-09-02T18:41:33.843 に答える
2

はい、上記の方法はとても素晴らしいです。そして、私はそれらのいくつかを試しました。最後に、次のような方法を見つけました。

    from threading import Timer

    def sync():

        do something...

        sync_timer = Timer(self.interval, sync, ())
        sync_timer.start()

Recursiveと同じです。

わかりました、この方法があなたの要件を満たすことを願っています。:)

于 2014-03-26T01:04:36.933 に答える
1

実際のサーバー(Windows)タスクスケジューラへのアクセスを許可せずに、システムの他のユーザーにジョブをスケジュールするように提供する必要があったため、これが誰にとっても役立つかどうかはわかりません。この再利用可能なアプリを作成しました。

ユーザーは、必要なコマンド/タスク/.bat ファイルを作成できるサーバー上の 1 つの共有フォルダーにアクセスできることに注意してください。このタスクは、このアプリを使用してスケジュールできます。

アプリ名はDjango_Windows_Scheduler です

スクリーンショット: ここに画像の説明を入力

于 2017-01-11T19:34:28.060 に答える