2012-06-04 4 views
7

ich einige Probleme mit dem regulären Ausdruck in urls.py mit (Ich bin ein Anfänger sowie reguläre Ausdrücke im Allgemeinen django)Wie lautet die Regex-Bewertungsreihenfolge urls.py in django?

Hier ist meine ursprüngliche urls.py

url(r'^name/(?P<name>\w+)/$', 'course.views.name'), 
url(r'^', 'course.views.index'), 

Und ich habe versucht, Zugriff auf sie mit diesem:

http://127.0.0.1:8000/name/blah/ 

Meine Ansicht wie folgt aussieht:

def index(request): 
    return HttpResponse("Hello, sam. You're at the course index.") 

def name(request, name): 
    return HttpResponse("Hello, %s. You're at the course index." % name) 

Das Ergebnis, das ich bekommen habe, war, dass ich, egal welche Eingabe ich gab, regelmäßig die "Index" -Funktion bekam und nicht die "Name" -Funktion. Ich dachte, das Problem liege bei der ersten Regex.

Aber dann änderte ich das die zweite man:

url(r'^$', 'course.views.index'), 

und das funktioniert genau so, wie ich es arbeiten dachte an!

Ich verstehe, dass "$" Ende der Zeile bedeutet, aber sollte nicht der erste Regex zuerst ausgewertet wurden? In welcher Reihenfolge werden diese Ausdrücke abgeglichen?

Hinzufügen eines "$" zu jeder URL ist nicht so ein großer Deal, aber ich würde gerne verstehen, warum ich es dort hinstelle.

Ich verwende Django1.4 und Python 2.7

Antwort

3

lesen Django document

Wie Django eine Anfrage verarbeitet

Wenn ein Benutzer eine Seite von Ihrer Django betriebenen Seite anfordert Dies ist der Algorithmus, dem das System bis folgt, um festzustellen, welcher Python-Code ausgeführt werden soll:

  1. Django bestimmt das zu verwendende Root-URLconf-Modul. Normalerweise ist dies der Wert der Einstellung ROOT_URLCONF, aber wenn das eingehende HttpRequest-Objekt über ein Attribut mit dem Namen urlconf verfügt (durch Middleware Anfrageverarbeitung festgelegt), wird der Wert anstelle der ROOT_URLCONF-Einstellung verwendet.
  2. Django lädt das Python-Modul und sucht nach der Variable urlpatterns. Dies sollte eine Python-Liste im Format der Funktion django.conf.urls.patterns() sein.
  3. Django durchläuft die einzelnen URL-Muster der Reihe nach und stoppt bei der ersten URL, die der angeforderten URL entspricht.
  4. Sobald eine der Regexes übereinstimmt, importiert und ruft Django die angegebene Ansicht auf, die eine einfache Python-Funktion ist. Der Ansicht wird ein HttpRequest als erstes Argument und alle in der Regex erfassten Werte als verbleibende Argumente übergeben.
  5. Wenn keine Regex übereinstimmt oder wenn an einem beliebigen Punkt in diesem Prozess eine Ausnahme ausgelöst wird, ruft Django eine entsprechende Fehlerbehandlungsansicht auf. Siehe Fehlerbehandlung unten.

Es sagte 3. Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL. Also ich denke, dies ein Fehler ist.

Sie $ in jeder URL-Muster hinzufügen sollten, es sei denn Including other URLconfs

+1

Hinzufügen eines "$" zu jeder URL ist nicht so ein großer Deal, aber ich würde gerne verstehen, warum ich es dort setze :) – Samudra

1

Du hast Recht, die django doc sagt:

Wie Django eine Anfrage

verarbeitet Wenn ein Benutzer eine Seite von Ihrer Anfragen Django-betriebene Site, dies ist der Algorithmus, dem das System folgt, um festzustellen, welcher Python-Code ausgeführt werden soll:

  1. Django bestimmt das zu verwendende Root-URLconf-Modul. Normalerweise ist dies der Wert der Einstellung ROOT_URLCONF. Wenn jedoch das eingehende HttpRequest-Objekt ein Attribut namens urlconf hat (das durch die Verarbeitung von Middleware-Anforderungen festgelegt wurde), wird der Wert anstelle der Einstellung ROOT_URLCONF verwendet.
  2. Django lädt das Python-Modul und sucht nach der Variable urlpatterns. Dies sollte eine Python-Liste in dem Format sein, das von der Funktion django.conf.urls.patterns() zurückgegeben wird.
  3. Django durchläuft die einzelnen URL-Muster der Reihe nach und stoppt bei der ersten URL, die der angeforderten URL entspricht.
  4. Sobald eine der Regexes übereinstimmt, importiert und ruft Django die angegebene Ansicht auf, die eine einfache Python-Funktion ist. Der Ansicht wird ein HttpRequest als erstes Argument und alle in der Regex erfassten Werte als verbleibende Argumente übergeben.
  5. Wenn keine Regex übereinstimmt oder wenn während eines beliebigen Zeitpunkts in diesem Prozess eine Ausnahme ausgelöst wird, ruft Django eine entsprechende Fehlerbehandlungsansicht auf. Siehe Fehlerbehandlung unten.

Dies ist auch das, was another SO post eine andere URL Auswertung Problem beheben lässt.

+2

Ich hatte dies durch, aber das hat nicht erklärt, warum die 2. Regex (url (r '^' ...) wurde gefunden, und nicht die erste (url (r '^ ...) in meinem ursprünglichen urls.py.Ist das? In der Tat, wie ich dieses Dokument zu verstehen, zu bedeuten , die erste ist diejenige, die hätte passen sollen, richtig? Habe ich etwas falsch verstanden? – Samudra

+1

Ja, ich bin nicht klar ^^ Nachdem ich das Dokument noch einmal gelesen habe, wird nicht erwähnt, dass ein URL-Muster geöffnet bleibt (mit Nein '$') lässt die Auswertung auch geöffnet! Also für mich ist es ein Fehler. – Emmanuel