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

时间:2016-01-04 12:58:14

标签: python linux django shell manage.py

我想要实现的目标:

我想创建一个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

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

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

6 个答案:

答案 0 :(得分:9)

首先,您不应该使用sudo访问Python shell。没有必要以root身份运行。

其次,创建从命令提示符运行的脚本的方法是编写自定义manage.py脚本,以便运行./manage.py deactivate_users。执行此操作的完整说明位于the documentation

答案 1 :(得分:3)

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

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

答案 2 :(得分: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()

答案 3 :(得分:0)

根据丹尼尔早先在这个帖子中的评论,我创建了一个简单的脚本来完成工作。我正在为这个线程的读者分享这个,他们正在努力实现同样的目标。此脚本将创建一个有效的“ manage.py deactivate_user ”功能。

这是您的Django app文件夹结构的示例参考:

Django folder structure

您想要创建“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。

答案 4 :(得分:0)

打开Django Shell python manage.py shell

然后运行execfile('filename.py')

答案 5 :(得分:0)

如果您使用的是Django 1.8+,那么另一个有用的选择是编写自己的脚本,并使用manage.py runscript对其进行调用。

例如,您可以编写一个名为db_init.py的脚本并将其放在utils文件夹下。
然后使用以下命令启动该脚本:

initState()

参考:
https://django-extensions.readthedocs.io/en/latest/runscript.html