9

我想要达到的目标:

我想创建一个 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 以执行自定义代码?

4

6 回答 6

11

首先,您不应该使用sudo. 无需以 root 身份运行。

其次,创建从命令提示符运行的脚本的方法是编写自定义的 manage.py 脚本,这样您就可以运行./manage.py deactivate_users. 完整的说明在文档中。

于 2016-01-04T13:08:16.123 回答
8

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

$ sudo python manage.py shell << EOF
user = User.objects.get(username=FooBar)
user.is_active = False
user.save()
exit()
EOF
于 2016-01-04T13:06:30.053 回答
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()
于 2016-01-04T13:19:01.430 回答
2

根据 Daniel 前面在此线程中的评论,我创建了一个简单的脚本来完成工作。我正在为试图实现相同目标的该线程的读者分享这一点。该脚本将创建一个有效的“ manage.py deactivate_user ”函​​数。

这是您的 Django 应用程序文件夹结构的示例参考:

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,而是使用 = True。

于 2016-01-04T13:41:10.220 回答
0

打开 Django 外壳python manage.py shell

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

于 2017-07-11T08:39:57.970 回答
0

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

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

python3 manage.py runscript utils.db_init

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

于 2020-06-12T06:52:06.697 回答