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)?
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)?
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!
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:
urlresolvers.get_resolver()
RegexURLResolver
, che è responsabile della risoluzione degli URL. Passando a None
questa funzione si ottiene il tuo URLConf "root".get_resolver()
utilizza una cache, _resolver_cache
, per URLConfs caricati._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.
Quando avrò la possibilità giocherò con questo e vedrò se funziona. –
Questo cuciture anche un modo elegante per farlo:
http://codeinthehole.com/writing/how-to-reload-djangos-url-config/
semplicemente che per ricaricare il modulo di URL di root:
reload_urlconf()
Stai usando 'mod_wsgi'? In tal caso, puoi riavviare l'app senza riavviare l'intero server Apache. –
@ 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? –
@ 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. –