2016-01-04 17 views
7

Quello che voglio ottenere:Come eseguire il codice nella shell Django con uno script Python esterno?

vorrei creare uno script python per disattivare gli utenti Django nel database dalla CLI. Mi sono inventato questo:

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

Il codice sopra FUNZIONA quando inserisco manualmente il comando manuale dopo il comando. Tuttavia, vorrei mettere eseguire i comandi in uno script di .py come

$ sudo python script.py 

diffirent Ora ho provato aproaches:

  • os.system("command1 && command2 && command3")
  • subprocess.Popen("command1 && command2 && command3", stdout=subprocess.PIPE, shell=True)

Il problema:

Questo non funziona! Penso che questo problema sia qui perché Python attende finché la shell Django aperta (primo comando) non finisce mai. Non esegue il resto dei comandi nello script mentre il primo comando lo mette in attesa.

subprocess.popen può eseguire comandi in una shell ma solo nella shell Python, mi piacerebbe utilizzare la shell Django.

Qualche idea su come accedere alla shell di Django con uno script .py per l'esecuzione di codice personalizzato?

+0

ne dite 'guscio manage.py python falsetru

risposta

8

In primo luogo, non si dovrebbe essere accede la shell Python con sudo. Non è necessario essere in esecuzione come root.

In secondo luogo, il modo per creare uno script che viene eseguito dal prompt dei comandi è scrivere uno script manage.py personalizzato, in modo da poter eseguire ./manage.py deactivate_users. Le istruzioni complete per farlo sono in the documentation.

3

Provare a immettere i comandi al funzionamento django-shell come un documento qui:

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

Se si desidera eseguire uno script Python che accede modelli Django, è innanzitutto necessario impostare una variabile d'ambiente:

import os 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "<path>.settings") 

in cui è necessario sostituire <path> dalla directory del progetto, quello che contiene la file settings.py.

È quindi possibile importare i file modello, ad esempio:

from <path>.models import User 
user = User.objects.get(username=FooBar) 
user.is_active = False 
user.save() 
0

Sulla base del commento di Daniel in precedenza in questa discussione ho creato un semplice script per ottenere il lavoro fatto. Sto condividendo questo per i lettori di questo thread che stanno cercando di raggiungere lo stesso obiettivo. Questo script creerà una funzione "manage.py deactivate_user" funzionante.

Questo è un esempio di riferimento la struttura delle cartelle app Django:

Django folder structure

si desidera creare il file "deactivate_user.py" e posizionarlo nella gestione/comandi directory/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') 

chiamate lo script utilizzando "python manage.py deactivate_user" È inoltre possibile creare uno script "activate_user" con lo stesso codice, ma invece di user.is_active = uso False = True.

0

Aprire Django Shell python manage.py shell

Poi gestita execfile('filename.py')

Problemi correlati