Как выполнить код в оболочке Django с помощью внешнего скрипта python?
чего я хочу добиться:
Я хотел бы создать скрипт python для деактивации пользователей Django в базе данных из CLI. Я придумал вот что:--8-->
$ sudo python manage.py shell
>>> user = User.objects.get(username=FooBar)
>>> user.is_active = False
>>> user.save()
>>> exit()
приведенный выше код работает, когда я вручную вводил его вручную команду за командой. Однако я хотел бы поместить команды execute в один.py скрипт как
$ sudo python script.py
теперь я попробовал diffirent aproaches:
os.system("command1 && command2 && command3")
subprocess.Popen("command1 && command2 && command3", stdout=subprocess.PIPE, shell=True)
проблема:
Это не работает! я думаю эта проблема здесь, потому что Python ждет, пока не откроется оболочка Django (первая команда), которая никогда не заканчивается. Он не выполняет остальные команды в скрипте, поскольку первая команда помещает его в удержание.
subprocess.popen
может выполнять команды в оболочке, но только в оболочке Python, Я хотел бы использовать оболочку Django.
кто-нибудь идеи, как получить доступ к оболочке Django с a .скрипт py для выполнения пользовательского кода?
5 ответов
во-первых, вы не должны получать доступ к своей оболочке Python с помощью sudo
. Нет необходимости работать как root.
во-вторых, способ создать скрипт, который запускается из командной строки, - это написать пользовательский manage.py скрипт, так что вы можете запустить ./manage.py deactivate_users
. Полные инструкции для этого находятся в документация.
попробуйте ввести команды в запущенную django-shell в качестве документа здесь:
$ sudo python manage.py shell << EOF
user = User.objects.get(username=FooBar)
user.is_active = False
user.save()
exit()
EOF
если вы хотите выполнить скрипт Python, который обращается к моделям Django, вам сначала нужно установить переменную среды:
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()
на основе комментария Даниэля ранее в этом потоке я создал простой скрипт, чтобы выполнить эту работу. Я делюсь этим для читателей этой темы, которые пытаются достичь той же цели. Этот скрипт создаст рабочий"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 " с тем же кодом, но вместо пользователя.is_active = False use = True.