Django urls.py viene eseguito solo una volta. Perché? Come chiama le viste alla prossima richiesta?

0

Durante il test di django cashing sul nostro server di sviluppo, uno dei nostri senior ha chiesto se è possibile modificare il valore del timeout della cache su urls.py senza riavviare il servizio http.

Alla prima nota, ero sicuro al 100% che si possa fare cambiando il valore di timeout in modo dinamico.

Ad esempio - Come suggerito dal mio altro collega, Se salviamo il valore di timeout in un file xml separato e leggiamo questo valore di file in urls.py e assegniamo quel valore al comando di caching, quindi cambiando il valore nel file xml , il timeout di memorizzazione nella cache verrà aggiornato senza riavviare il servizio http.

Tuttavia, quando abbiamo verificato ciò, abbiamo capito che funziona solo al primo colpo dato che urlpattern object è passato al server django e urls.py non viene mai eseguito nuovamente a meno che il servizio http non venga riavviato.

Alla fine per soddisfare i nostri requisiti, abbiamo dovuto scrivere qualche altro script all'interno della funzione di visualizzazione per caricare di nuovo urls.py in modo che legga il nuovo valore di timeout della cache.

Quindi la mia domanda è: perché urls.py non viene caricato ogni volta su ogni url hit, ma solo una volta alla prima ?, dove si trova questo oggetto urlpattern ?, Qualsiasi idea!

    
posta Avinash Kr Mallik 16.04.2015 - 18:50
fonte

2 risposte

2

Non è passato da nessuna parte, ma è importato solo una volta. Python esegue un modulo quando viene importato, dopodiché viene semplicemente tenuto in memoria. Django può accedere alla variabile urlpatterns nel modulo ogni volta che lo fa, il modulo non viene rieseguito.

Questo non è specifico per Django o urls.py, è solo come funzionano i moduli Python.

    
risposta data 09.01.2017 - 13:12
fonte
1

Esaminando la documentazione , ho trovato questo dopo aver cercato il repository Django per %codice%. Guarda attraverso django.core.urlresolvers . RegexURLResolver è chiamato sul root urlconf a meno che non sia impostato da qualunque chiamata re.compile . L'output di get_resolver , e quindi il risultato della creazione del resolver URL, viene memorizzato nella cache:

@lru_cache.lru_cache(maxsize=None)
def get_resolver(urlconf):
if urlconf is None:
    from django.conf import settings
    urlconf = settings.ROOT_URLCONF
return RegexURLResolver(r'^/', urlconf)

get_resolver è chiamato due volte nella classe re.compile . Potresti voler approfondire questo aspetto, e il RegexURLResolver decoratore, per qualunque cosa tu voglia fare.

    
risposta data 17.04.2015 - 00:32
fonte

Leggi altre domande sui tag