我想实现的是:
我想创build一个python脚本来从CLI停用数据库中的Django用户。 我想出了这个:
$ sudo python manage.py shell >>> user = User.objects.get(username=FooBar) >>> user.is_active = False >>> user.save() >>> exit()
上面的代码在我手动inputmanualy命令后执行。 不过,我想把这个命令放在一个.py脚本里
$ sudo python script.py
现在我已经尝试了不同的方法:
os.system("command1 && command2 && command3")
subprocess.Popen("command1 && command2 && command3", stdout=subprocess.PIPE, shell=True)
问题:
这不行! 我认为这个问题在这里,因为Python等待,直到打开的Djangoshell(第一个命令)完成,永远不会。 它不会执行脚本中的其余部分,因为第一个命令将其置于Hold状态。
subprocess.popen
可以在shell中执行命令,但只能在Python shell中执行,我想使用Django shell。
任何人想法如何使用.py脚本访问Django shell以执行自定义代码?
首先,你不应该用sudo
来访问你的Python shell。 没有必要以root身份运行。
其次,创建从命令提示符运行的脚本的方法是编写自定义的manage.py脚本,以便运行./manage.py deactivate_users
。 完整的说明在文档中 。
如果你想执行一个访问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()
尝试将这些命令作为here文档输入到正在运行的django-shell:
$ sudo python manage.py shell << EOF user = User.objects.get(username=FooBar) user.is_active = False user.save() exit() EOF
根据丹尼尔早些时候在这个线程中的评论,我创建了一个简单的脚本来完成工作。 我正在分享这个试图达到相同目标的线程的读者。 这个脚本将创建一个工作的“ manage.py deactivate_user ”函数。
这是你的Django应用程序文件夹结构的示例参考:
你想创建“deactivate_user.py”文件,并将其放在management / commands / 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')
通过使用“ python manage.py deactivate_user ”调用脚本您也可以使用相同的代码创建“activate_user”脚本,而不是user.is_active = False use = True。
打开Django Shell python manage.py shell
然后运行execfile('filename.py')