Buscar..


Cómo Django maneja una solicitud

Django maneja una solicitud enrutando la ruta URL entrante a una función de vista. La función de visualización es responsable de devolver una respuesta al cliente que realiza la solicitud. Las diferentes URL son manejadas generalmente por diferentes funciones de vista. Para dirigir la solicitud a una función de vista específica, Django analiza la configuración de su URL (o URLconf para abreviar). La plantilla de proyecto predeterminada define el URLconf en <myproject>/urls.py .

Su URLconf debe ser un módulo de Python que define un atributo denominado urlpatterns , que es una lista de django.conf.urls.url() de django.conf.urls.url() . Cada instancia de url() debe, como mínimo, definir una expresión regular (una expresión regular) para que coincida con la URL y un objetivo, que es una función de vista o un URLconf diferente. Si un patrón de URL apunta a una función de vista, es una buena idea darle un nombre para hacer referencia fácilmente al patrón más adelante.

Echemos un vistazo a un ejemplo básico:

# In <myproject>/urls.py

from django.conf.urls import url

from myapp.views import home, about, blog_detail

urlpatterns = [
    url(r'^$', home, name='home'),
    url(r'^about/$', about, name='about'),
    url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),
]

Este URLconf define tres patrones de URL, todos dirigidos a una vista: home , about y blog-detail .

  • url(r'^$', home, name='home'),

La expresión regular contiene un anclaje de inicio '^', seguido inmediatamente por un anclaje de extremo '$'. Este patrón coincidirá con las solicitudes en las que la ruta de la URL sea una cadena vacía y las myapp.views a la vista de home definida en myapp.views .

  • url(r'^about/$', about, name='about'),

Esta expresión regular contiene un anclaje de inicio, seguido por la cadena literal about/ , y el anclaje final. Esto coincidirá con la URL /about/ y lo dirigirá a la vista about . Dado que cada URL no vacía comienza con un / , Django corta convenientemente la primera barra para usted.

  • url(r'^blog/(?P<id>\d+)/$', blog_detail, name='blog-detail'),

Este regex es un poco más complejo. Define el ancla de inicio y la cadena literal blog/ , como el patrón anterior. La siguiente parte, (?P<id>\d+) , se llama un grupo de captura. Un grupo de captura, como sugiere su nombre, captura una parte de la cadena, y Django pasa la cadena capturada como un argumento a la función de vista.

La sintaxis de un grupo de captura es (?P<name>pattern) . name define el nombre del grupo, que también es el nombre que Django usa para pasar el argumento a la vista. El patrón define qué caracteres coinciden con el grupo.

En este caso, el nombre es id , por lo que la función blog_detail debe aceptar un parámetro llamado id . El patrón es \d+ . \d significa que el patrón solo coincide con caracteres numéricos. + significa que el patrón debe coincidir con uno o más caracteres.

Algunos patrones comunes:

Modelo Usado para Partidos
\d+ carné de identidad Uno o más caracteres numéricos
[\w-]+ babosa Uno o más caracteres alfanuméricos, guiones bajos o guiones
[0-9]{4} año (largo) Cuatro números, de cero a nueve.
[0-9]{2} año (corto)
mes
dia del mes
Dos números, de cero a nueve.
[^/]+ segmento de trayectoria Cualquier cosa excepto una barra

El grupo de captura en el patrón de blog-detail está seguido por un literal / y el ancla final.

Las URL válidas incluyen:

  • /blog/1/ # passes id='1'
  • /blog/42/ # passes id='42'

Las URL inválidas son por ejemplo:

  • /blog/a/ # 'a' does not match '\d'
  • /blog// # no characters in the capturing group does not match '+'

Django procesa cada patrón de URL en el mismo orden en que se definen en urlpatterns . Esto es importante si varios patrones pueden coincidir con la misma URL. Por ejemplo:

urlpatterns = [
    url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
    url(r'blog/overview/$', blog_overview, name='blog-overview'),
]

En el URLconf anterior, el segundo patrón no es accesible. El patrón coincidiría con la URL /blog/overview/ , pero en lugar de llamar a la vista blog_overview , la URL primero coincidirá con el patrón de blog-detail del blog-detail y llamará a la vista blog_detail con un argumento slug='overview' .

Para asegurarse de que la URL /blog/overview/ se enrute a la vista blog_overview , el patrón se debe colocar sobre el patrón de blog-detail del blog-detail :

urlpatterns = [
    url(r'blog/overview/$', blog_overview, name='blog-overview'),
    url(r'blog/(?P<slug>[\w-]+)/$', blog_detail, name='blog-detail'),
]

Establecer el espacio de nombres de la URL para una aplicación reutilizable (Django 1.9+)

Configure el app_name su aplicación para usar automáticamente un espacio de nombres de URL configurando el atributo app_name :

# In <myapp>/urls.py
from django.conf.urls import url

from .views import overview

app_name = 'myapp'
urlpatterns = [
    url(r'^$', overview, name='overview'),
]

Esto establecerá el espacio de nombres de la aplicación en 'myapp' cuando se incluya en la raíz URLconf>. El usuario de su aplicación reutilizable no necesita hacer ninguna otra configuración que no sea incluir sus URL:

# In <myproject>/urls.py
from django.conf.urls import include, url

urlpatterns = [
    url(r'^myapp/', include('myapp.urls')),
]

Su aplicación reutilizable ahora puede revertir las URL usando el espacio de nombres de la aplicación:

>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'

El URLconf raíz todavía puede establecer un espacio de nombres de instancia con el parámetro de namespace :

# In <myproject>/urls.py
urlpatterns = [
    url(r'^myapp/', include('myapp.urls', namespace='mynamespace')),
]

Tanto el espacio de nombres de la aplicación como el espacio de nombres de la instancia se pueden usar para revertir las URL:

>>> from django.urls import reverse
>>> reverse('myapp:overview')
'/myapp/overview/'
>>> reverse('mynamespace:overview')
'/myapp/overview/'

El espacio de nombres de la instancia se establece de forma predeterminada en el espacio de nombres de la aplicación si no se establece explícitamente.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow