2010-09-01 18 views
21

Sto sviluppando un'applicazione django e nel tempo, gli URL sono cresciuti. Ne ho molti con me ora e, a causa di alcuni cambiamenti che ho fatto, una vista ha iniziato a funzionare male. Quando provo a ottenere http://example.com/foo/edit_profile, si suppone che esegua una visualizzazione di una determinata funzione di visualizzazione X ma che sia in esecuzione Y. Da qualche parte il routing dell'URL sta rovinando e non riesco a capirlo. Ho usato il metodo django.core.urlresolvers.resolve per provarlo dalla shell e posso confermare che l'URL viene risolto erroneamente. Tuttavia, non so come eseguire il debug di questo e individuare il problema.Django url debugger

Idealmente, mi piacerebbe vedere qualcosa come "testato questo schema", "testato questo schema" ecc. Fino a quando non trova finalmente quello corretto e posso quindi guardarmi intorno dove è stato risolto. Non riesco a trovare nulla di simile.

Non è un problema comune per i progetti più grandi? Cosa fanno le persone?

Aggiornamento

So come funziona il sistema e come guardare attraverso gli URL uno per uno. Questo è quello che sto cercando di fare. Questa domanda sta fondamentalmente chiedendo una scorciatoia.

+0

Devo ancora vedere un insieme di URL questo complesso. Il mio 'urls.py' tende ad avere un sacco di include, ognuna delle quali ha il suo prefisso univoco (ad esempio'^foo' includerebbe gli URL nell'app 'foo', così potrei andare lì per scoprire dove sarà la prossima partita Se stai riscontrando questo problema, il tuo 'urls.py' è probabilmente troppo complicato. Potremmo essere in grado di aiutarti a capire cosa c'è che non va se lo pubblichi ... –

+1

In realtà, il mio (e tutti gli altri I abbiamo visto) sono tutti "namespace" (un prefisso univoco seguito da un include) .Per qualche motivo però, uno dei miei foo/URL viene instradato alla barra/applicazione e restituisce qualcosa da lì. Sarebbe bello avere un debugger per dirmi semplicemente in quale ordine viene tentata la risoluzione in modo da poter individuare il problema –

risposta

26

hai già provato a eseguire

manage.py show_urls 

dopo l'installazione django_extensions?

http://vimeo.com/1720508 - guarda da 06:58.

Questo dovrebbe darvi in ​​quale ordine viene tentata la risoluzione url.

Spero che questo aiuti

+0

Interessante ... Non ero a conoscenza di questo. Grazie! –

+1

Buona idea. Non dimenticare che devi aggiungere django_extensions a installed_apps prima di provare ad usarlo https://django-extensions.readthedocs.org/en/latest/installation_instructions.html – glaucon

0

Guarda i tuoi urlconfs, trova quale urlpattern invoca la tua vista Y e verifica se l'espressione regolare è più generale di quanto dovrebbe essere. Prova a commentare l'urlpattern che causa la corrispondenza errata e vedi se corrisponde correttamente a X.

In genere, questo non è un problema per me, ma si verifica. Tieni sempre modelli più specifici prima di quelli generali. Usa prefissi statici per dividere lo spazio dei nomi dell'URL, per evitare false corrispondenze.

+0

Ciò richiede un tempo proibitivo con il gran numero di URL e espressioni regolari che ho attualmente. È quello che sto facendo adesso ma io Mi piacerebbe avere un "debugger URL" decente, piuttosto che l'intera attività di commento e commento nelle righe da i vari file url. –

0

Si può supporre, che passa attraverso il urlpatterns dall'alto verso il basso e il primo che corrisponde verrà eseguito.

Come sapete, che viene eseguita vista (Y) pensare che:

  • se Y è prima X: i modelli di Y corrisponda all'URL (ma non dovrebbe)
  • se X è prima Y: i pattern di X non corrispondono all'URL (ma dovrebbero)

Puoi fornire alcuni esempi più espliciti del tuo URLConf? Di quanto posso darti una risposta più esplicita.

+0

Sono tipici. Simile a quello che ha detto Dominic. So come funzionano e i tuoi due punti vanno bene. È solo che è noioso passare la cosa manualmente quando si cerca di ottenere una correzione, motivo per cui sto cercando un debugger. –

+0

Puoi sempre inserire alcune linee di stampa nella sorgente di django, se pensi davvero che ti aiuti. Ti mostrerà semplicemente che va esattamente da cima a fondo e cerca di far corrispondere ogni regex fino a quando non corrisponde. MAybe qui: http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L143 –

+0

Questo è quello che sto facendo. :) –

3

Vorrei commentare gli schemi nel tuo url.py fino a quando non ottieni un errore 404 quando provi a navigare su foo. Se tale modello è un inclusivo, lo ricascatteremo e commenterò le righe in quell'url.py. Alla fine saprai esattamente quale pattern corrisponde.

Quindi vorrei prendere la funzione di vista che sta chiamando e codice hard quello. Se si utilizza una visualizzazione generica o qualcosa di sottile, lo renderei il più ovvio e diretto possibile. A quel punto, dovresti sapere quale regola corrisponde, e perché e quale codice sta eseguendo nella vista.

+0

Hmm. Si. Sarebbe un po 'lento ma lavorabile. –

+0

Ok, che ne dici di questo: commenta * tutti * i tuoi modelli di URL di primo livello e dopo aver confermato con un 404, riattiva il pattern che pensi sia in uso. Se ti sbagli, impari qualcosa. Se hai ragione, esplora l'inclusione (supponendo che sia una inclusione) e commenta tutto eccetto quello che pensi sia in uso. Con questa scorciatoia, dovrebbero essere necessari dai cinque ai dieci minuti per capire se il codice che si desidera utilizzare sia in uso. – hughdbrown