13

crontab からニュースレターを毎日送信する関数を作成する必要があります。インターネットでこれを行う2つの方法を見つけました:

最初 - django プロジェクト フォルダーに配置されたファイル:

#! /usr/bin/env python
import sys
import os

from django.core.management import setup_environ
import settings
setup_environ(settings)

from django.core.mail import send_mail
from project.newsletter.models import Newsletter, Address

def main(argv=None):
    if argv is None:
        argv = sys.argv

    newsletters = Newsletter.objects.filter(sent=False)
    message = 'Your newsletter.'

    adr = Address.objects.all()
    for a in adr:
        for n in newsletters:
            send_mail('System report',message, a ,['user@example.com'])

if __name__ == '__main__':
    main()

それが機能するかどうかはわかりませんし、実行する方法もわかりません。それがrun.pyと呼ばれているとしましょう。それで、cronで呼び出す必要があり0 0 * * * python /path/to/project/run.py ますか?

2 番目の解決策 - send 関数を任意の場所に作成し (通常の django 関数と同じように)、run.py スクリプトを作成します。

import sys
import os

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

module_name = sys.argv[1]
function_name = ' '.join(sys.argv[2:])

exec('import %s' % module_name)
exec('%s.%s' % (module_name, function_name))

そして、cron呼び出しで:0 0 * * * python /path/to/project/run.py newsletter.views daily_job()

どちらの方法が機能しますか、またはどちらが優れていますか?

4

7 に答える 7

37

i would suggest creating your functionality as django-management-command and run it via crontab

if your command is send_newsletter then simply

0 0 * * * python /path/to/project/manage.py send_newsletter

and you don't need to take care of setting the settings module in this case/

于 2010-07-08T03:08:19.857 に答える
10

cronを介して管理コマンドを実行するというAshokの提案はうまく機能しますが、もう少し堅牢なものを探している場合は、Kronosのようなライブラリを調べます。

# app/cron.py

import kronos

@kronos.register('0 * * * *')
def task():
    pass
于 2011-12-20T12:27:00.523 に答える
3

django-chronographをご覧になることをお勧めします。基本的に、他の提案と同様の方法であなたが望むことを行います+管理パネルからcronジョブを管理する可能性を提供します. cron ジョブは、django コマンドとして実装する必要があります。その後、呼び出して保留中のすべてのジョブを実行できます

python manage.py cron

これは、cronによってトリガーされる必要があります。

于 2011-01-10T10:58:59.190 に答える
1

django-cronもあります。使い方はとても簡単で、インストールやセットアップは他にありません。

しかし、それが実際にどのように機能するかはわかりません...つまり、ジョブがどのように実行され、誰もサイトにリクエストを送信しないときにジョブが実行されるかどうかがわかりません。しかし、あなたは試すことができます!

于 2010-07-08T09:32:09.583 に答える
1

オプション 3 をお勧めします: django-extensionsでjobs システムを使用します。関連する拡張コマンドは次のとおりです。

  • create_jobs– 指定されたアプリ名の Django ジョブ コマンド ディレクトリ構造を現在のディレクトリに作成します。これは印象的なジョブ システムの一部です。
  • runjob– 単一のメンテナンス ジョブを実行します。ジョブシステムの一部。
  • runjobs– スケジュールされたメンテナンス ジョブを実行します。毎時、毎日、毎週、毎月を指定します。ジョブシステムの一部。

これにより、Django 内ですべてのジョブ処理を管理できるため、crontab をいじり続ける必要がなくなります。

于 2010-07-08T01:37:26.747 に答える
1

最初のオプションと同様の方法を使用して、いくつかのコマンドライン アプリケーションを作成しました。DJANGO_SETTINGS_MODULE(私にとっては) 通常の Python プログラムのように感じるので、環境変数を使用するのではなく、この方法で行うことを好みます。

また、モジュールを ; と同じディレクトリに配置する必要がないことにも注意してくださいsettings.py。設定モジュールの絶対 Python パスを使用できます。

from django.core.management import setup_environ
from project import settings
setup_environ(settings)
#The rest of your imports

とにかく、 PEP 8は相対インポートを思いとどまらせます。

私は常に Django アプリケーションを ( /usr/lib64/python2.6/site-packagesGentoo の) サイト パッケージにインストールするので、crontab からの設定について心配する必要はありませんがPYTHONPATH、それが広く実践されている方法だとは思いません。また、setuptools 自動スクリプト作成を使用して、コンソール スクリプトを適切な場所 (/usr/binたとえば、) に配置し、自動的に適切な名前を付けるようにしています。最初のオプションもこれを容易にします。

于 2010-07-08T04:09:05.357 に答える
0

オプション1は私にとってはうまくいきます。私は通常、スクリプト cd をプロジェクト ディレクトリに移動し、「python ./script_name.py」を実行して、不思議なパスの問題が発生しないようにします...怠惰ですが、一貫して動作します。

于 2010-07-08T05:22:06.273 に答える