如何通过外部python脚本在Django shell中执行代码?

2024-06-23 20:12:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我想要实现的目标:

我想创建一个python脚本,从CLI中停用数据库中的Django用户。我想到了这个:

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

当我一个接一个地手动输入它时,上面的代码工作。但是,我希望将执行命令放在一个.py脚本中,如

$ sudo python script.py

现在我尝试了不同的方法:

  • 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以执行自定义代码吗?


Tags: django代码py命令脚本目标clisudo
3条回答

如果要执行访问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()

首先,不应该使用sudo访问Python shell。不需要以根用户身份运行。

其次,创建从命令提示符运行的脚本的方法是编写一个自定义manage.py脚本,这样就可以运行./manage.py deactivate_users。完整的操作说明见the documentation

尝试将命令作为here文档输入正在运行的django shell:

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

相关问题 更多 >

    热门问题