Django - Mapeo de URL
Ahora que tenemos una vista de trabajo como se explicó en los capítulos anteriores. Queremos acceder a esa vista a través de una URL. Django tiene su propia manera de mapear URL y se hace editando el archivo url.py de su proyecto(myproject/url.py). El archivo url.py se ve así:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
#Examples
#url(r'^$', 'myproject.view.home', name = 'home'),
#url(r'^blog/', include('blog.urls')),
url(r'^admin', include(admin.site.urls)),
)
Cuando un usuario solicita una página en su aplicación web, el controlador Django se encarga de buscar la vista correspondiente a través del archivo url.py y luego devuelve la respuesta HTML o un error 404 no encontrado, si no se encuentra. En url.py, lo más importante es el"urlpatterns"tupla. Es donde se define la asignación entre URL y vistas. Una asignación es una tupla en patrones de URL como:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
#Examples
#url(r'^$', 'myproject.view.home', name = 'home'),
#url(r'^blog/', include('blog.urls')),
url(r'^admin', include(admin.site.urls)),
url(r'^hello/', 'myapp.views.hello', name = 'hello'),
)
La línea marcada asigna la URL "/ home" a la vista de saludo creada en el archivo myapp / view.py. Como puede ver arriba, un mapeo se compone de tres elementos:
The pattern- Una expresión regular que coincida con la URL que desea que se resuelva y mapee. Todo lo que pueda funcionar con el módulo python 're' es elegible para el patrón (útil cuando desea pasar parámetros a través de la URL).
The python path to the view - Igual que cuando está importando un módulo.
The name- Para realizar la reversión de URL, deberá utilizar patrones de URL con nombre como se hizo en los ejemplos anteriores. Una vez hecho esto, simplemente inicie el servidor para acceder a su vista a través de: http: //127.0.0.1/hello
Organizar sus URL
Hasta ahora, hemos creado las URL en el archivo "myprojects / url.py", sin embargo, como se dijo anteriormente sobre Django y la creación de una aplicación, el mejor punto era poder reutilizar aplicaciones en diferentes proyectos. Puede ver fácilmente cuál es el problema si está guardando todas sus URL en el archivo "projecturl.py". Por lo tanto, la mejor práctica es crear un "url.py" por aplicación e incluirlo en el archivo url.py de nuestro proyecto principal (antes incluíamos las URL de administración para la interfaz de administración).
¿Cómo se hace?
Necesitamos crear un archivo url.py en myapp usando el siguiente código:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)
Entonces myproject / url.py cambiará a lo siguiente:
from django.conf.urls import patterns, include, url
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
#Examples
#url(r'^$', 'myproject.view.home', name = 'home'),
#url(r'^blog/', include('blog.urls')),
url(r'^admin', include(admin.site.urls)),
url(r'^myapp/', include('myapp.urls')),
)
Hemos incluido todas las URL de la aplicación myapp. El home.html al que se accedió a través de "/ hello" ahora es "/ myapp / hello", que es una estructura mejor y más comprensible para la aplicación web.
Ahora imaginemos que tenemos otra vista en myapp "morning" y queremos mapearla en myapp / url.py, luego cambiaremos nuestro myapp / url.py a -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^hello/', 'myapp.views.hello', name = 'hello'),
url(r'^morning/', 'myapp.views.morning', name = 'morning'),
)
Esto se puede refactorizar para:
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),)
Como puede ver, ahora usamos el primer elemento de nuestro urlpatternstupla. Esto puede resultar útil cuando desee cambiar el nombre de su aplicación.
Envío de parámetros a vistas
Ahora sabemos cómo mapear URL, cómo organizarlas, ahora veamos cómo enviar parámetros a las vistas. Una muestra clásica es el ejemplo de artículo (desea acceder a un artículo a través de “/ articles / article_id”).
La transferencia de parámetros se realiza capturándolos con el regexpen el patrón de URL. Si tenemos una vista como la siguiente en "myapp / view.py"
from django.shortcuts import render
from django.http import HttpResponse
def hello(request):
return render(request, "hello.html", {})
def viewArticle(request, articleId):
text = "Displaying article Number : %s"%articleId
return HttpResponse(text)
Queremos mapearlo en myapp / url.py para poder acceder a él a través de "/ myapp / article / articleId", necesitamos lo siguiente en "myapp / url.py" -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),
url(r'^article/(\d+)/', 'viewArticle', name = 'article'),)
Cuando Django vea la URL: “/ myapp / article / 42”, pasará los parámetros '42' a la vista viewArticle, y en su navegador debería obtener el siguiente resultado:
Tenga en cuenta que el orden de los parámetros es importante aquí. Supongamos que queremos la lista de artículos de un mes de un año, agreguemos una vista viewArticles. Nuestro view.py se convierte en -
from django.shortcuts import render
from django.http import HttpResponse
def hello(request):
return render(request, "hello.html", {})
def viewArticle(request, articleId):
text = "Displaying article Number : %s"%articleId
return HttpResponse(text)
def viewArticle(request, month, year):
text = "Displaying articles of : %s/%s"%(year, month)
return HttpResponse(text)
El correspondiente url.py el archivo se verá así -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),
url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
url(r'^articles/(\d{2})/(\d{4})', 'viewArticles', name = 'articles'),)
Ahora, cuando vaya a “/ myapp / articles / 12/2006 /” obtendrá 'Visualización de artículos de: 2006/12' pero si invierte los parámetros no obtendrá el mismo resultado.
Para evitarlo, es posible vincular un parámetro de URL al parámetro de vista. Por eso, nuestrourl.py se convertirá en -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('myapp.views',
url(r'^hello/', 'hello', name = 'hello'),
url(r'^morning/', 'morning', name = 'morning'),
url(r'^article/(\d+)/', 'viewArticle', name = 'article'),
url(r'^articles/(?P\d{2})/(?P\d{4})', 'viewArticles', name = 'articles'),)