Roteamento com path e re_path em Django
No Django, as view functions (ou simplesmente views) são funções Python que recebem uma requisição HTTP e retornam uma resposta HTTP . Essas views são mapeadas para URLs específicas através de um arquivo de roteamento chamado urls.py
.
Por exemplo, no arquivo views.py
, temos as seguintes funções de visualização:
from django.http import HttpResponse
def index(request):
return HttpResponse("<h2>Página Principal</h2>")
def about(request):
return HttpResponse("<h2>Sobre o Site</h2>")
def contact(request):
return HttpResponse("<h2>Contato</h2>")
Essas funções de visualização são mapeadas para caminhos específicos no arquivo urls.py
por meio da função path
, que pertence ao pacote django.urls
:
from django.urls import path
from hello import views
urlpatterns = [
path('', views.index),
path('about', views.about),
path('contact', views.contact),
]
path
A função path
é responsável por mapear uma view para um caminho específico e segue a seguinte assinatura:
path(route, view, kwargs=None, name=None)
route
: é uma string que contém o caminho da URL.view:
é a função de visualização que será chamada quando o caminho da URL for acessado.kwargs
: são argumentos adicionais passados para a função de visualização.name
: Nome atribuído à rota, que pode ser usado para referenciá-la em outras partes do projeto.
No exemplo acima, apenas os dois primeiros parâmetros foram utilizados, pois são obrigatórios: o caminho da URL e a função de visualização. Para adicionar um nome à rota, pode ser incluído o parâmetro name
:
path('', views.index, name='home')
Aqui, a rota foi nomeada como "home" e pode ser referenciada em outras partes do projeto.
re_path
Embora a função path
seja adequada para maioria dos casos, ela exige que o caminho da URL corresponda exatamente ao padrão especificado. Por exemplo, no caso do mapeamento para a função views.about
, o endereço precisa ser exatamente "about"
. Se uma barra adicional for incluída, como em "about/"
, a rota não será encontrada.
Para lidar com casos em que o caminho da URL pode variar, o Django fornece a função re_path
, que permite a utilização de expressões regulares para definir padrões de roteamento mais flexíveis. la também está disponível no pacote django.urls
e segue a assinatura semelhante à função path
:
re_path(route, view, kwargs=None, name=None)
Vamos reescrever o arquivo urls.py
para o seguinte:
from django.urls import path, re_path
from hello import views
urlpatterns = [
path('', views.index),
re_path(r'^about', views.about),
re_path(r'^contact', views.contact),
]
O símbolo ^
na rota ^about
indica que a URL deve começar com a palavra "about"
. Isso permite que qualquer URL iniciada por "about"
seja capturada pela função views.about
, como:
"about"
"about/"
"about/us"
Principais Elementos de Expressões Regulares
A função re_path
oferece suporte a expressões regulares, permitindo definir padrões avançados para as rotas. Abaixo estão os principais elementos da sintaxe de expressões regulares aplicáveis no Django:
Elemento | Descrição |
---|---|
^ | Marca o início da string. |
$ | Marca o final da string. |
+ | Um ou mais caracteres. |
? | Zero ou um caractere. |
{n} | Exatamente n ocorrências. |
{n, m} | De n a m ocorrências. |
. | Qualquer caractere (exceto quebra de linha). |
\d+ | Um ou mais dígitos. |
\D+ | Um ou mais caracteres não numéricos. |
\w+ | Um ou mais caracteres alfanuméricos. |
Exemplos de padrões e correspondências:
Padrão | URLs Correspondentes | URLs Não Correspondentes |
---|---|---|
r'^$' | raiz do site | - |
r'^about' | about/ , about/contact | - |
r'^about/contact' | about/contact | about/ |
r'^products/\d+/' | products/23/ , products/6459/ | products/abc/ |
r'^products/\D+/' | products/abc/ , products/abc/123 | products/123/ |
r'^products/phones| tablets/' | products/phones/ , products/tablets/ | products/phones-tablets/ |
r'^products/[-\w]+/' | products/abc-123/ | - |
r'^products/[A-Z]{2}/' | products/BR/ | products/Br/ , products/Bra/ |
Passando Valores
O parâmetro kwargs
das funções path
e re_path
permite passar valores para a view
.
No exemplo a seguir, a função about
em views.py
recebe dois parâmetros adicionais, name
e age
:
from django.http import HttpResponse
def index(request):
return HttpResponse("<h2>Página Principal</h2>")
def about(request, name, age):
return HttpResponse(f"""
<h2>Sobre o Usuário</h2>
<p>Nome: {name}</p>
<p>Idade: {age}</p>
""")
No arquivo urls.py
, esses valores são passados utilizando o parâmetro kwargs:
from django.urls import path
from hello import views
urlpatterns = [
path('', views.index),
path('about', views.about, kwargs={"name": "Tom", "age": 38}),
]
Neste caso, a rota "about"
transmitirá os valores "Tom"
e 38
como argumentos name
e age
para a função about
. O navegador exibirá o seguinte conteúdo:
Documentação oficial: