2016-01-04 87 views
7

我想達到的目標:如何通過外部python腳本在Django shell中執行代碼?

我想創建一個python腳本從CLI數據庫停用Django的用戶。我想出了這個:

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

上面的代碼工作時,我手動輸入manualy命令後命令。不過,我希望把執行的命令在一個腳本的.py像

$ sudo python script.py 

現在,我已經試過向度aproaches:

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

問題:

這不行! 我認爲這個問題在這裏,因爲Python等待,直到打開的Django shell(第一個命令)完成從來沒有。它不會執行腳本中的其餘命令,因爲第一個命令將其置於保持狀態。

subprocess.popen可以在shell中執行命令,但只能在Python shell中執行,我想使用Django shell。

任何想法如何使用.py腳本訪問Django shell以執行自定義代碼?

+0

怎麼樣'蟒蛇manage.py殼 falsetru

回答

8

首先,你不應該與sudo訪問你的Python殼。沒有必要以root身份運行。

其次,創建從命令提示符運行的腳本的方法是編寫自定義的manage.py腳本,以便您可以運行./manage.py deactivate_users。完整的說明在the documentation

3

嘗試輸入的命令來運行Django的殼作爲此文件:

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

如果要執行訪問Django模型Python腳本,你首先需要設置環境變量:

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

中,你需要通過你的項目目錄替換<path>,包含了一個文件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') 

呼叫是通過使用「蟒蛇manage.py deactivate_user」的劇本也可以創建一個「activate_user」腳本代碼相同但不是user.is_active =使用虛假=真。

0

開放的Django殼牌python manage.py shell

然後運行execfile('filename.py')