2012-06-04 7 views
7

que estaba teniendo algunos problemas con la expresión regular en urls.py (soy un principiante a django, así como expresiones regulares en general)¿Cuál es el orden de evaluación de expresiones regex de urls.py en django?

Aquí está mi urls.py originales

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

Y yo estaba tratando para acceder a ella usando la siguiente:

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

Mi vista se parece a:

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) 

El resultado que obtuve fue que, independientemente de la información que ingresaba, obtenía regularmente la función de "índice" y no la de "nombre". Pensé que el problema era con la primera expresión regular.

Pero entonces, he cambiado el uno del segundo a:

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

y esto funciona de la manera que pensé que funcione!

Entiendo que "$" significa fin de línea, pero ¿no debería haber evaluado primero la primera expresión regular? ¿Cuál es el orden en el que se combinan estas expresiones?

Agregar un "$" a cada url no es gran cosa, pero me gustaría entender por qué lo estoy poniendo allí.

estoy usando Django1.4 y Python 2.7

Respuesta

3

Lea el Django document

Cómo Django procesa una solicitud

Cuando un usuario solicita una página de su sitio hecho con Django , este es el algoritmo que el sistema sigue a determine qué código de Python ejecutar:

  1. Django determina el módulo raíz URLconf que se utilizará. Normalmente, este es el valor de la configuración ROOT_URLCONF, pero si el objeto entrante HttpRequest tiene un atributo llamado urlconf (establecido por middleware solicitud de procesamiento), su valor se utilizará en lugar de la configuración ROOT_URLCONF.
  2. Django carga ese módulo de Python y busca la variable urlpatterns. Esta debe ser una lista de Python, en el formato devuelto por la función django.conf.urls.patterns().
  3. Django recorre cada patrón de URL, en orden, y se detiene en el primero que coincide con la URL solicitada.
  4. Una vez que una de las expresiones regulares coincide, Django importa y llama a la vista dada, que es una función simple de Python. Se pasa la vista a HttpRequest como su primer argumento y cualquier valor capturado en la expresión regular como argumentos restantes.
  5. Si no coincide la expresión regular, o si se produce una excepción durante cualquier punto de este proceso, Django invoca una vista de manejo de errores apropiada. Ver el tratamiento de errores a continuación.

Se dijo 3. Django runs through each URL pattern, in order, and stops at the first one that matches the requested URL. Así que creo que esto es un error.

Debe añadir $ en cada patrón de URL a menos Including other URLconfs

+1

Agregar un "$" a cada url no es gran cosa, pero me gustaría entender por qué lo estoy poniendo :) – Samudra

1

Tienes razón, la django doc dice:

Cómo Django procesa una solicitud

Cuando un usuario solicita una página de su Sitio con Django, este es el algoritmo que sigue el sistema para determinar qué código de Python ejecutar:

  1. Django determina el módulo raíz URLconf que se utilizará. Normalmente, este es el valor de la configuración ROOT_URLCONF, pero si el objeto HttpRequest entrante tiene un atributo llamado urlconf (establecido por el proceso de solicitud de middleware), su valor se usará en lugar de la configuración ROOT_URLCONF.
  2. Django carga ese módulo de Python y busca la variable urlpatterns. Esta debería ser una lista de Python, en el formato devuelto por la función django.conf.urls.patterns().
  3. Django recorre cada patrón de URL, en orden, y se detiene en el primero que coincide con la URL solicitada.
  4. Una vez que una de las expresiones regulares coincide, Django importa y llama a la vista dada, que es una función simple de Python. Se pasa la vista a HttpRequest como su primer argumento y cualquier valor capturado en la expresión regular como argumentos restantes.
  5. Si no coincide ninguna expresión regular, o si se produce una excepción durante cualquier punto de este proceso, Django invoca una vista de manejo de errores apropiada . Ver Manejo de errores a continuación.

Esto es también lo que sugiere another SO post para fijar otro de los temas de evaluación URL.

+2

Había pasado por esto, pero esto no explicaba por qué la segunda expresión regular (url (r '^' ...) consiguió emparejado, y no el 1er (url (r '^ P ...) en mi urls.py original ¿Lo hace? De hecho, como entiendo este documento significa , el primero es el que debería haber coincidido, ¿verdad? ¿He entendido mal algo? – Samudra

+1

Sí, no estoy seguro ^^ Después de leer el documento una vez más, no se menciona que dejar un patrón de URL abierto (sin '$') deja abierta la evaluación también. Entonces para mí es un error. – Emmanuel

Cuestiones relacionadas