Как выполнить код в оболочке 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:

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 " с тем же кодом, но вместо пользователя.is_active = False use = True.


Открыть Django Shell python manage.py shell

затем запустите execfile('filename.py')