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:
<h2>Sobre o Usuário</h2>
<p>Nome: Tom</p>
<p>Idade: 38</p>
Documentação oficial: