Django - Mapeamento de URL
Agora que temos uma visão funcional conforme explicado nos capítulos anteriores. Queremos acessar essa visualização por meio de um URL. Django tem sua própria maneira de mapear URL e isso é feito editando o arquivo url.py do seu projeto(myproject/url.py). O arquivo url.py se parece com -
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)),
)
Quando um usuário faz uma solicitação de uma página em seu aplicativo da web, o controlador Django assume para procurar a visualização correspondente por meio do arquivo url.py e, em seguida, retorna a resposta HTML ou um erro 404 não encontrado, se não encontrado. Em url.py, o mais importante é o"urlpatterns"tupla. É onde você define o mapeamento entre URLs e visualizações. Um mapeamento é uma tupla em padrões 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'),
)
A linha marcada mapeia a URL "/ home" para a visualização hello criada no arquivo myapp / view.py. Como você pode ver acima, um mapeamento é composto por três elementos -
The pattern- Um regexp que corresponde ao URL que você deseja resolver e mapear. Tudo que pode funcionar com o módulo python 're' é elegível para o padrão (útil quando você deseja passar parâmetros via url).
The python path to the view - Mesmo quando você está importando um módulo.
The name- Para realizar a reversão de URL, você precisará usar padrões de URL nomeados como feito nos exemplos acima. Feito isso, basta iniciar o servidor para acessar sua visualização via: http: //127.0.0.1/hello
Organizando seus URLs
Até agora, criamos as URLs no arquivo “myprojects / url.py”, no entanto, conforme declarado anteriormente sobre o Django e a criação de um aplicativo, o melhor ponto era poder reutilizar aplicativos em diferentes projetos. Você pode ver facilmente qual é o problema, se estiver salvando todos os seus URLs no arquivo “projecturl.py”. Portanto, a melhor prática é criar um “url.py” por aplicativo e incluí-lo no arquivo url.py de nossos projetos principais (antes incluímos URLs de administração para a interface de administração).
Como isso é feito?
Precisamos criar um arquivo url.py em myapp usando o seguinte código -
from django.conf.urls import patterns, include, url
urlpatterns = patterns('', url(r'^hello/', 'myapp.views.hello', name = 'hello'),)
Então myproject / url.py mudará para o seguinte -
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')),
)
Incluímos todos os URLs do aplicativo myapp. O home.html que foi acessado por meio de “/ hello” agora é “/ myapp / hello” que é uma estrutura melhor e mais compreensível para o aplicativo da web.
Agora vamos imaginar que temos outra visualização em myapp “manhã” e queremos mapeá-la em myapp / url.py, então mudaremos nosso myapp / url.py para -
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'),
)
Isso pode ser re-fatorado 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 você pode ver, agora usamos o primeiro elemento do nosso urlpatternstupla. Isso pode ser útil quando você deseja alterar o nome do seu aplicativo.
Envio de parâmetros para visualizações
Agora sabemos como mapear URL, como organizá-los, agora vamos ver como enviar parâmetros para visualizações. Um exemplo clássico é o exemplo do artigo (você deseja acessar um artigo através de “/ articles / article_id”).
A passagem de parâmetros é feita capturando-os com o regexpno padrão de URL. Se tivermos uma visualização como a seguinte em “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 mapeá-lo em myapp / url.py para que possamos acessá-lo via “/ myapp / article / articleId”, precisamos do seguinte em “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'),)
Quando o Django verá a url: “/ myapp / article / 42”, ele passará os parâmetros '42' para a visualização viewArticle, e em seu navegador você deverá obter o seguinte resultado -
Observe que a ordem dos parâmetros é importante aqui. Suponha que desejemos a lista de artigos de um mês de um ano, vamos adicionar uma visualização viewArticles. Nosso view.py se torna -
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)
O correspondente url.py arquivo será semelhante a -
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'),)
Agora, quando você vai para “/ myapp / articles / 12/2006 /”, você obterá 'Exibindo artigos de: 2006/12', mas se você inverter os parâmetros, não obterá o mesmo resultado.
Para evitar isso, é possível vincular um parâmetro de URL ao parâmetro de exibição. Para isso, nossourl.py vai se tornar -
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'),)