Estoy trabajando con Django y uso el shell de Django todo el tiempo. La parte molesta es que mientras el servidor Django se recarga con los cambios de código, el shell no lo hace, por lo que cada vez que hago un cambio en un método que estoy probando, necesito salir del shell y reiniciarlo, volver a importar todos los módulos que necesito, reinicializar todas las variables que necesito, etc. Si bien el historial de iPython ahorra mucho escribir en esto, esto sigue siendo un problema. ¿Hay alguna manera de hacer que django shell se recargue automáticamente, de la misma manera que lo hace el servidor de desarrollo de django?
Sé sobre reload (), pero importo muchos modelos y generalmente uso from app.models import *
sintaxis, por lo que reload () no es de mucha ayuda.
Respuestas:
Recomiendo usar el proyecto django-extensions como se indicó anteriormente por dongweiming. Pero en lugar de solo el comando de administración 'shell_plus', use:
Esto abrirá un cuaderno IPython en su navegador web. Escriba su código allí en una celda, sus importaciones, etc. y ejecútelo.
Cuando cambie sus módulos, simplemente haga clic en el elemento del menú del cuaderno 'Kernel-> Reiniciar'
Ahí lo tienes, tu código ahora está usando tus módulos modificados.
fuente
Sugeriría usar la extensión de recarga automática de IPython .
./manage.py shell In [1]: %load_ext autoreload In [2]: %autoreload 2
Y a partir de ahora, todos los módulos importados se actualizarán antes de evaluar.
In [3]: from x import print_something In [4]: print_something() Out[4]: 'Something' # Do changes in print_something method in x.py file. In [5]: print_something() Out[5]: 'Something else'
También funciona si se importó algo antes del
%load_ext autoreload
comando../manage.py shell In [1]: from x import print_something In [2]: print_something() Out[2]: 'Something' # Do changes in print_something method in x.py file. In [3]: %load_ext autoreload In [4]: %autoreload 2 In [5]: print_something() Out[5]: 'Something else'
También es posible evitar que algunas importaciones se
%aimport
actualicen con el comando y 3 estrategias de recarga automática:Esto generalmente funciona bien para mi uso, pero hay algunas advertencias:
fuente
/manage.py shell_plus
... si escribe%load_ext autoreload
y luego%autoreload 2
, los modelos se recargarán automáticamente.mire el comando manage.py shell_plus proporcionado por el proyecto django-extensions . Cargará todos los archivos de su modelo al iniciar el shell. y recargue automáticamente cualquier modificación pero no necesita salir, puede llamar directamente allí
fuente
Mi solución es que escribo el código y lo guardo en un archivo y luego uso:
Entonces puedo hacer el cambio, guardar y ejecutar ese comando nuevamente hasta que arregle lo que estoy tratando de arreglar.
fuente
exit()
al final del archivo py para salir del shell de Django de una manera más limpia. Gracias.Parece que el consenso general sobre este tema es que python reload () apesta y no hay una buena manera de hacerlo.
fuente
Reload () no funciona en el shell de Django sin algunos trucos. Puede consultar este hilo na y mi respuesta específicamente:
¿Cómo se recarga un módulo de modelo de Django utilizando el intérprete interactivo a través de "manage.py shell"?
fuente
Mi solución para este inconveniente es la siguiente. Estoy usando IPython.
$ ./manage.py shell > import myapp.models as mdls # 'mdls' or whatever you want, but short... > mdls.SomeModel.objects.get(pk=100) > # At this point save some changes in the model > reload(mdls) > mdls.SomeModel.objects.get(pk=100)
Para Python 3.x , 'reload' debe importarse usando:
from importlib import reload
Espero eso ayude. Por supuesto, es con fines de depuración.
Salud.
fuente
Utilice shell_plus con una configuración de ipython. Esto se habilitará
autoreload
antes de que shell_plus importe automáticamente cualquier cosa.Edite su perfil de ipython (
~/.ipython/profile_default/ipython_config.py
):c.InteractiveShellApp.exec_lines = ['%autoreload 2'] c.InteractiveShellApp.extensions = ['autoreload']
Abra un caparazón; tenga en cuenta que no es necesario incluir
--ipython
:¡Ahora cualquier cosa definida en
SHELL_PLUS_PRE_IMPORTS
oSHELL_PLUS_POST_IMPORTS
( docs ) se recargará automáticamente!Tenga en cuenta que si su shell está en un depurador (ex
pdb.set_trace()
) cuando guarda un archivo, puede interferir con la recarga.fuente
En lugar de ejecutar comandos desde el shell de Django, puede configurar un comando de administración como este y volver a ejecutarlo cada vez.
fuente
No es exactamente lo que quieres, pero ahora tiendo a crear comandos de administración para probar y manipular cosas.
En el comando, puede configurar un grupo de locales de la manera que desee y luego colocarlos en un shell interactivo.
import code class Command(BaseCommand): def handle(self, *args, **kwargs): foo = 'bar' code.interact(local=locals())
Sin recarga, pero una forma fácil y menos molesta de probar interactivamente la funcionalidad de django.
fuente