3

./manage.py test someapp --settings=settings_test のように、常に settings_test からテストを実行します。問題は、オプションを追加することを忘れないことが時々あるということです。

管理コマンドtest.pyだけの一般的なアプリを紹介したいと思います。INSTALLED_APPS 設定での配置に応じて、デフォルトが上書きされます。コマンド自体の中で、 --settings オプションのデフォルトを変更したいと思います。どうやってやるの?

manage.py に似ているが、設定の代わりに settings_test を使用する local.py ファイルを作成できることを認識しています。ただし、ポイントは引き続き ./manage.py を実行することですが、./manage.py test someapp の後に常に「--settings=settings_test」と入力するのではなく、デフォルトとして settings_test を使用します。

4

3 に答える 3

3

何度か試行した後、実際の管理コマンドが呼び出される前に manage.py が設定を設定するのに十分な時間がかかることがわかりました。そのため、(私が知る限り)そこで変更することは基本的に不可能です。最終的には、manage.py を変更しても問題ないように思われるため (たとえば、そこにデフォルト設定ファイルがあります)、これを処理するのに妥当な場所であると判断したので、そこに実装しました。

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "myapp.settings")

    argv = sys.argv
    try:
        if argv[1] == 'test' and not any([k.startswith('--settings') for k in argv]):
            os.environ["DJANGO_SETTINGS_MODULE"] = "myapp.test_settings"
    except IndexError:
        pass

    from django.core.management import execute_from_command_line
    execute_from_command_line(argv)

これは期待どおりに機能しているようで、大きな欠点や問題は見られません。修正されてうれしいです。

于 2015-05-22T09:44:46.670 に答える
2

アプリに実装することで、デフォルトのコマンドをオーバーライドできます (例: common_app)。

management.commandscommon_appにパッケージを作成します。そこにテストコマンドを実装します。

# this is commonapp/management/commands/test.py
try:
    from south.management.commands import test
except ImportError:
    from django.core.management.commands import test


class Command(test.Command):
    def handle(self, *args, **kwargs):
        kwargs['settings'] = kwargs.get('settings', 'common_app.settings')
        super(Command, self).handle(*args, **kwargs)

settings.py「--settings=」フラグが指定されていない場合、これは common_app のファイルを使用します。ただし、「settings_test」でその文字列を変更すると、Python パスで最初に見つかった settings_test.py が読み込まれます。

Southもこのコマンドのオーバーライドを行うため、完全を期すために、south インポートを追加しました。しかし、インストールされている他のアプリのいずれかが test コマンドをオーバーライドしている場合、その考えは理解できます。

__init__.py「管理」および「コマンド」パッケージを作成するための空のファイルを忘れないでください。

Django カスタム管理コマンドの詳細については、RTFMを参照してください。

于 2013-09-03T14:28:12.300 に答える