22

実行を開始する前に、Django 開発サーバーに何かをさせたいと考えています。これを行うために、新しいアプリを作成して の先頭に追加し、次のコードを使用してアプリ内にファイルをINSTALLED_APPS作成しました。management/commands/runserver.py

from django.contrib.staticfiles.management.commands.runserver import Command as RunserverCommand
class Command(RunserverCommand):
    def run(self, *args, **options):
        self.stdout.write('About to start running on ' + self.addr)
        super(Command, self).run(*args, **options)

(もちろん、私が実際にやりたいことは、stdout に 1 行を書き込むよりも複雑ですが、これは問題を示す最も単純な例です。または他のメソッドではrunなくをオーバーライドする理由は、既にこのコードの実行時に設定されます。)handleself.addr

を実行する./manage.py runserverと、「About to start running on 127.0.0.1」という行が 1 回ではなく、サーバーが実行を開始する前に 2 回表示されます。なぜこれが起こっているのか、それに対して何ができるのか?

4

2 に答える 2

33

自動リローダー プロセスが原因であることが判明しました。autoreload プロセスは元のプロセスと同じ引数を取得し、同じ初期化プロセスを実行することがわかります。解決策は、自動リローダーによって生成されたプロセスで実行されていない場合にのみ、サーバー前のコードを実行することでした。これは、環境変数を介して検出できます。

import os
from django.contrib.staticfiles.management.commands.runserver import Command as RunserverCommand
class Command(RunserverCommand):
    def run(self, *args, **options):
        if os.environ.get('RUN_MAIN') != 'true':
            self.stdout.write('About to start running on ' + self.addr)
        super(Command, self).run(*args, **options)
于 2015-02-13T16:23:21.693 に答える
21

ローカル開発サーバーは、自動リローダー用に別のプロセスを実行します。--noreload フラグを渡すことで、自動リロード プロセスをオフにすることができます。

python manage.py runserver --noreload
于 2015-02-12T23:45:19.067 に答える