2016-01-04 3 views
7

外部PythonスクリプトでDjangoシェルでコードを実行するには?私が達成したい何

私はCLIからデータベースにDjangoのユーザを無効にするPythonスクリプトを作成したいと思います。私はこれを思いついた:

$ sudo python manage.py shell 
>>> user = User.objects.get(username=FooBar) 
>>> user.is_active = False 
>>> user.save() 
>>> exit() 

上記のコードは私が手作業でコマンドを入力したときに働いています。しかし、私は

$ sudo python script.py 

今、私が試したdiffirentのように1の.pyスクリプト内のコマンドを実行入れたいaproaches:

  • os.system("command1 && command2 && command3")
  • subprocess.Popen("command1 && command2 && command3", stdout=subprocess.PIPE, shell=True)

問題:

これは機能しません。 私はだと思います。Pythonは開かれたDjangoシェル(最初のコマンド)が終了するまで待ちません。スクリプト内の残りのコマンドは、最初のコマンドが保留になるので実行されません。

subprocess.popenはシェルでコマンドを実行できますが、Pythonシェルでのみ実行できます。私はDjangoシェルを使いたいと思います。

カスタムコードの実行のために.pyスクリプトを使ってDjangoシェルにアクセスする方法はありますか?

+0

どのように実行しますか? – falsetru

答えて

8

、あなたはsudoとあなたのPythonシェルにアクセスするべきではありません。ルートとして実行する必要はありません。

第2に、コマンドプロンプトから実行するスクリプトを作成する方法は、カスタムmanage.pyスクリプトを作成することで、./manage.py deactivate_usersを実行することができます。それを行うための完全な指示はthe documentationです。

3

ここに文書として実行されているジャンゴ・シェルに入力したコマンドを試してみてください。

まず
$ sudo python manage.py shell << EOF 
user = User.objects.get(username=FooBar) 
user.is_active = False 
user.save() 
exit() 
EOF 
2

あなたはDjangoのモデルにアクセスするPythonスクリプトを実行したい場合は、あなたが最初に環境変数を設定する必要があります含まれていますが、プロジェクトディレクトリで<path>を交換する必要があるでは

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<path>.settings") 

、1をファイルsettings.py

あなたはその後、例えば、あなたのモデルファイルをインポートすることができます。

from <path>.models import User 
user = User.objects.get(username=FooBar) 
user.is_active = False 
user.save() 
0

以前の私は仕事を得るための簡単なスクリプトを作成して、このスレッドではダニエルのコメントに基づいて。私は同じ目標を達成しようとしているこのスレッドの読者にこれを共有しています。このスクリプトは、 "manage.py deactivate_user"という機能を作成します。

これはあなたのDjangoアプリのフォルダ構造の例参照です:

Django folder structure

あなたが「deactivate_user.py」ファイルを作成し、管理/コマンド/ deactivate_user.pyディレクトリに配置します。

from django.core.management.base import BaseCommand, CommandError 
from django.contrib.auth.models import User 

class Command(BaseCommand): 
    help = 'Deactivate user in the database' 

    def handle(self, *args, **options): 
     username = raw_input('Please type the username of the user you want remove: ') 
     try: 
      user = User.objects.get(username=username) 
      user.is_active = False 
      user.save() 
      print ('User is now deactivated in the database.') 
     except User.DoesNotExist: 
      print ('Username not found') 

あなたは真=も同じコードで「activate_user」スクリプトを作成する代わりに、偽= user.is_active利用できる「のpython manage.pyのdeactivate_user」を使用してスクリプトを呼び出します。

0

オープンDjangoのシェルpython manage.py shell

次に execfile('filename.py')

関連する問題