El Blog de Trespams

Blog personal sobre tecnologia, gestió de projectes i coses que se me passen pel cap

Custom management commands

Si heu fet al manco el tutorial de Django haureu fet servir per exemple el típic

python manage.py runserver

per a iniciar el servidor. A partir de la versió 1.0 de Django podem fer servir una sintaxi semblant per crear comandaments lligats a la nostra aplicació i que s'executin també d'aquesta manera.

Podem crear comandaments per fer qualsevol cosa, de fet es que acaba fent és executar un script de Python. Així doncs, ens podríem demanar quina avantatja hi ha en fer-ho així, vàries: - No necessitam definir cap variable d'entorn per dir quin settings hem de fer servir, l'script manage.py ja se n'encarrega. - El comandament quedarà lligat a l'aplicació. Per tant podem crear comandaments que depenguin d'una aplicació concreta i que la complementin. - Podem accedir a l'ajuda del comandament si l'hem definida. Permet a l'usuari saber com ha de fer servir la comanda.

Podem crear tres tipus de comandament a mida, que trobam definits dins django.core.management.base

  • Comandaments que hereten de AppCommand i que poden prendre com a paràmetre una llista d'aplicacions Django.
  • Comandaments que hereten de LabelCommand que poden prendre com a argument qualsevol cadena de text.
  • Comandaments que hereten de NoArgsCommand i que no prenen paràmetres.

Si anau a la documentació oficial de Django veureu que el que hi ha és més aviat poc. Potser perquè quan ja saps com és fa pareix tan fàcil que potser no mereix l'esforç. Tot i això, crec que és una opció prou útil i que hauria de tenir més importància a la documentació.

Afortunadament hi ha al manco dos articles prou bons que ens ajuden amb exemples a treure partit d'aquesta funcionalitat. Si anam al codi font comprovarem que tot està força documentat, però la realitat és que encara que a partir de la versió 1 fer aquests tipus de coses s'ha convertit en trivial, en versions anteriors no ho era.

Aquest apunt té per objectius fer publicitat d'aquesta funcionalitat, podeu trobar més informació al codi font de Django i als següents apunts:

i exemples tant al codi font de Django com a django-extensions .

Fes-hi una ullada, després de tot, fer un hello world d'aquesta manera és prou senzill:

from django.core.management.base import NoArgsCommand


class Command(NoAgrsCommand):
help = "prints hello world"

def handle_app(self, app, **options):
print
"Hello world"

Per provar-ho creau un paquet python anomenat management dins la vostra aplicació Django, i dins aquest paquet un altre anomenat commands. Dins aquest hi posaríem els nostres scripts. Per exemple si la nostra aplicació es diu uep i volem crear un comandament que es cridi com python manage.py hello hauríem de crear una estructura com:

uep/ __init__.py models.py management/ __init__.py commands/ ___init__.py hello.py

Els noms dels comandament poden col·lisionar, així que o bé tenim noms prou especials o bé convé prefixar-los amb el nom de la nostra aplicació per tal de tenir una oportunitat més.

blog comments powered by Disqus