2011-02-01 21 views
10

¿Hay una manera de agregar mediante programación patrones de URL a Django sin tener que reiniciar el servidor?¿Agregar patrones de URL mediante programación en Django?

O hay una fuerza de manera Django para reprocesar/patrones de URL caché (la URLconf)?

+1

¿Está usando 'mod_wsgi'? Si es así, puede reiniciar su aplicación sin reiniciar todo el servidor Apache. –

+0

@ S. Lott para el servidor de producción sí, por lo que esto podría funcionar, ¿cómo reiniciar una aplicación específica? ¿Hay algo similar para el servidor de desarrollo? –

+0

@ S.Lott, para 'servidor de desarrollo' me refiero al servidor de desarrollo integrado que viene con Django, por ejemplo: python manage.py runserver. Sin embargo, es posible que haya malinterpretado su primer comentario, ¿sugirió que es posible reiniciar una sola aplicación de Django sin reiniciar las otras aplicaciones, o estaba sugiriendo que puede reiniciar las aplicaciones Django/All sin tener que reiniciar Apache? Tendría que hacer lo primero. –

Respuesta

3

Si usa gunicorn sin precargar el código, simplemente envíe un HUP al proceso maestro de gunicorn, generará nuevos trabajadores que cargarán el nuevo código, y cerrarán graciosamente los antiguos, ¡sin una sola solicitud perdida!

3

Intenté algo así pirateando algunas cosas en django.core.urlresolvers - funcionó para mí, pero tenga en cuenta que es un truco . Yo no sigo con el código, pero hice algo como esto:

  1. Django normalmente usa urlresolvers.get_resolver() para obtener una RegexURLResolver que se encarga de resolver las direcciones URL. Al pasar None a esta función obtiene su "raíz" URLConf.
  2. get_resolver() utiliza un caché, _resolver_cache, por URLconfs cargados.
  3. Restablecimiento _resolver_cache debería obligar a Django para recrear un URLresolver limpio.

Alternativamente, es posible que trate de desarmar el atributo _urlconf_module de la raíz RegexURLResolver, que debe obligar a Django para recargarlo (no estoy seguro acerca de esto, sin embargo, es posible que el módulo se almacenan en caché por Python).

from urlresolvers import get_resolver 

delattr(get_resolver(None), '_urlconf_module') 

Una vez más, no se garantiza que esto va a funcionar (Estoy trabajando desde la memoria de código que he descartado, obviamente, por alguna razón). Pero django/core/urlresolvers.py es definitivamente el archivo que querrás mirar.

EDIT: decidió experimentar algunos con esto y no funcionó ...

Edit2:

Mientras pensaba, sus módulos de URL se almacenan en caché por Python. Simplemente volver a cargarlos a medida que cambian podría funcionar (usando reload). Si su problema es que construye dinámicamente urlpatterns según algunos datos que pueden cambiar.

me trataron reload ing mis URL raíz (project.urls) y un módulo suburl (app.urls). Eso es todo lo que tuve que hacer para que las nuevas URL se muestren en get_resolver(None).url_patterns

Así que el truco podría ser así de simple: recargue manualmente su módulo de URL.

+0

Cuando tenga la oportunidad, jugaré con esto y veré si funciona. –

Cuestiones relacionadas