2011-02-01 3 views
10

C'è un modo per aggiungere programmaticamente URL Pattern a Django senza dover riavviare il server?Aggiunge programmaticamente URL Pattern in Django?

Oppure c'è un modo per forzare Django a rielaborare/memorizzare i pattern URL (l'URLconf)?

+1

Stai usando 'mod_wsgi'? In tal caso, puoi riavviare l'app senza riavviare l'intero server Apache. –

+0

@ S.Lott per il server di produzione sì, quindi questo potrebbe funzionare, come si fa a riavviare un'app specifica? C'è qualcosa di simile per il server di sviluppo? –

+0

@ S.Lott, Per "server di sviluppo", si intende il server di sviluppo buit-in fornito con Django, ad esempio: python manage.py runserver. Potrei aver frainteso il tuo primo commento, stavi suggerendo che è possibile riavviare una singola App Django senza riavviare le altre App, o stavi suggerendo di poter riavviare Django/Tutte le app senza dover riavviare Apache? Avrei bisogno di fare il primo. –

risposta

3

Se si utilizza gunicorn senza il precaricamento del codice, è sufficiente inviare un HUP al processo master gunicorn, genererà nuovi worker che caricano il nuovo codice e chiuderanno con grazia i vecchi, senza una singola richiesta persa!

3

Ho provato qualcosa di simile hackerando alcune cose in django.core.urlresolvers - ha funzionato per me ma nota che è un mod. Non ho ancora il codice, ma ho fatto qualcosa di simile:

  1. Django utilizza in genere per ottenere un urlresolvers.get_resolver()RegexURLResolver, che è responsabile della risoluzione degli URL. Passando a None questa funzione si ottiene il tuo URLConf "root".
  2. get_resolver() utilizza una cache, _resolver_cache, per URLConfs caricati.
  3. Il ripristino di _resolver_cache dovrebbe forzare Django a ricreare un URLResolver pulito.

In alternativa, si potrebbe tentare di disinserire l'attributo _urlconf_module della radice RegexURLResolver, che dovrebbe costringere Django ricaricarlo (non sono sicuro di questo, però, è possibile che il modulo sarà memorizzata nella cache dal Python).

from urlresolvers import get_resolver 

delattr(get_resolver(None), '_urlconf_module') 

Anche in questo caso, non è garantito che questo lavoro (sto lavorando a memoria dal codice che ho, ovviamente, scartato per qualche motivo). Ma django/core/urlresolvers.py è sicuramente il file che vuoi vedere.

EDIT: deciso di sperimentare un po 'con questo e non ha funzionato ...

EDIT2:

Come pensavo, i moduli URL verrà memorizzata nella cache da Python. Semplicemente ricaricandoli mentre cambiano potrebbe funzionare (usando reload). Se il tuo problema è che stai costruendo dinamicamente urlpatterns in base ad alcuni dati che potrebbero cambiare.

Ho provato reload i miei URL di root (project.urls) e un modulo di suburl (app.urls). Questo è tutto ciò che dovevo fare per i nuovi URL da visualizzare da get_resolver(None).url_patterns

Quindi il trucco potrebbe essere così semplice: Ricaricare manualmente il modulo URL.

+0

Quando avrò la possibilità giocherò con questo e vedrò se funziona. –