Se você está começando com Django, cedo ou tarde bate a confusão:
“Eu criei a view, mas o site não abre.”

Na prática, o problema quase sempre está no urls.py.
Testei isso dezenas de vezes em projetos reais, e o padrão se repete.

Pense no urls.py como o mapa do seu site.
Sem ele, o Django não sabe qual código executar para cada endereço.


O que é o urls.py na prática

O urls.py é o arquivo que liga três coisas:

  • Uma URL

  • Uma view

  • Um nome de rota

Quando alguém acessa:

 
meusite.com/blog/

O Django faz exatamente isso:

  1. Lê o urls.py

  2. Procura uma rota /blog/

  3. Executa a view associada

Sem esse arquivo bem configurado, nada aparece.


Estrutura básica de um urls.py

Vamos desmontar um urls.py real, sem pressa.

Importando o path

 
from django.urls import path

Aqui não tem mistério:

  • path() é a função que cria URLs

  • Toda rota no Django usa path()

Se você não importou isso, o arquivo nem funciona.


Importando as views

 
from .views import ( HomeView, BlogListView, PostDetailView, CategoryPostListView, )

Cada view é uma página.

Na prática:

  • HomeView → página inicial

  • BlogListView → lista de posts

  • PostDetailView → detalhe de um post

  • CategoryPostListView → posts por categoria

Esse foi o comportamento que observei em projetos reais.
Uma view = uma responsabilidade clara.


O app_name: pequeno detalhe, grande dor de cabeça

 
app_name = "blog"

Esse detalhe evita bugs difíceis de rastrear.

Ele serve para:

  • Evitar conflito entre apps

  • Usar reverse() no backend

  • Usar {% url %} no template

Exemplo real no template:

 
<a href="{% url 'blog:post_list' %}">Blog</a>

👉 blog: vem direto do app_name.

Na prática, quando você esquece isso, os templates quebram sem avisar claramente.


O coração do arquivo: urlpatterns

 
urlpatterns = [

Aqui mora tudo que importa.

Essa lista contém todas as rotas do app.
Cada item conecta:

👉 URL → View → Nome

Se não está nessa lista, o Django ignora.


Analisando cada rota com calma

Diagrama ilustrando o fluxo básico de uma requisição no Django. A URL acessada pelo usuário (/blog/) é interpretada pelo urlspy, que direciona a requisição para a view correta. A view processa os dados necessários e retorna um template HTML, que finalmente é exibido no navegador.

Página inicial

 
path( "", HomeView.as_view(), name="home", ),

Explicação direta:

  • "" → URL vazia → /

  • HomeView.as_view() → view baseada em classe

  • name="home" → nome da rota

Acesso final:

 
meusite.com/

Erro comum aqui: esquecer o as_view().


Lista de posts do blog

 
path( "blog/", BlogListView.as_view(), name="post_list", ),

Aqui já fica mais claro:

  • URL: /blog/

  • View: lista todos os posts

  • Nome da rota: post_list

Acesso:

 
meusite.com/blog/

Esse padrão é o mais usado em projetos de conteúdo.


Detalhe de post (URL dinâmica)

 
path( "posts/<slug:slug>/", PostDetailView.as_view(), name="post_detail", ),

Aqui entra um conceito crítico.

O que é <slug:slug>?

É um parâmetro dinâmico.

Exemplo real de URL:

 
/posts/como-aprender-django/

O valor como-aprender-django:

  • Vai para a view

  • A view usa isso para buscar o post certo no banco

Na prática, o Django faz:

 
slug = "como-aprender-django"

Depois disso, a view resolve o resto.


Posts por categoria

 
path( "categoria/<slug:slug>/", CategoryPostListView.as_view(), name="category_posts", ),

Exemplo de acesso:

 
/categoria/python/

Comportamento esperado:

  • Recebe o slug python

  • Filtra os posts daquela categoria

  • Retorna a lista correta

Esse padrão funciona muito bem para SEO e navegação.


Visualizando o fluxo mentalmente

Ilustração explicando o funcionamento de uma URL dinâmica com slug no Django. O valor presente na URL (/posts/como-aprender-django/) é capturado pelo parâmetro <slug> definido no urls.py e enviado para a view. A view utiliza esse valor para consultar o banco de dados, localizar o post correspondente e retornar o conteúdo correto ao usuário.

Uma forma simples de guardar isso:

 
URL → ViewTemplate

E no urls.py:

 
path("url/", MinhaView.as_view(), name="nome")

Sempre nessa ordem.
Sempre com esses três elementos.


Erros comuns de iniciantes (e como evitar)

Esses erros aparecem direto em suporte e projetos reais:

Esquecer a barra / no final da URL
Errar o nome da view importada
Não usar .as_view() em Class Based Views
Não definir app_name
Confundir slug com id

Na prática, 80% dos bugs de rota vêm daqui.


Como eu valido se meu urls.py está correto

Sempre sigo esse checklist:

  • A URL abre no navegador?

  • O nome da rota funciona no {% url %}?

  • A view está sendo chamada?

  • O slug chega corretamente na view?

Se tudo isso passa, o urls.py está sólido.


Em resumo

O urls.py não é só configuração.
Ele é o sistema nervoso do seu projeto Django.

Quando você entende:

  • path()

  • app_name

  • URLs dinâmicas

  • Relação entre URL e view

Você para de “brigar” com o framework.

E na prática, passa a resolver bugs muito mais rápido.

FAQ – Perguntas Frequentes sobre urls.py no Django

O que é o arquivo urls.py no Django?

O urls.py é o arquivo responsável por mapear as URLs do site para as views. Ele define qual código será executado quando o usuário acessa um determinado endereço. Sem ele, o Django não sabe o que mostrar.

Qual a função do path()?

A função path() cria uma rota. Ela conecta três elementos: a URL, a view e o nome da rota. Toda URL no Django precisa ser definida usando path() ou re_path().

Por que usar app_name no urls.py?

O app_name evita conflitos entre apps diferentes. Além disso, ele permite usar URLs nomeadas com segurança em templates e no backend, utilizando {% url %} e reverse().

O que significa usar as_view()?

O método as_view() é obrigatório em Class Based Views. Ele transforma a classe em uma função que o Django consegue executar. Sem isso, ocorre erro ao acessar a rota.

O que é um slug em uma URL?

Um slug é um texto amigável usado na URL. Geralmente representa o título de um conteúdo, como um post ou categoria. Exemplo: /posts/como-aprender-django/.

Qual a diferença entre slug e id?

O id é numérico e interno do banco de dados. O slug é legível, melhor para SEO e experiência do usuário. Na maioria dos blogs e sites de conteúdo, o slug é a melhor escolha.

Por que minha URL não abre no navegador?

Na prática, os motivos mais comuns são:

  • Esquecer a barra / no final da URL
  • Nome da view digitado errado
  • Esquecer o as_view()
  • Rota não registrada em urlpatterns

Preciso reiniciar o servidor após alterar o urls.py?

Normalmente não. O servidor de desenvolvimento do Django detecta mudanças automaticamente. No entanto, se algo estranho acontecer, reiniciar pode ajudar.

Posso ter vários urls.py no projeto?

Sim. Cada app pode ter seu próprio urls.py. Depois, você inclui essas rotas no urls.py principal do projeto usando include().

 

Se você está começando com Django e quer entender o framework como um todo, recomendo ler primeiro o artigo completo sobre o que é Django e para que ele serve . Ele te dá a base necessária para não se perder na estrutura do projeto.

Depois disso, o próximo passo natural é dominar os models. Na prática, muitos erros em URLs e views acontecem por falta de entendimento do banco de dados. Por isso, vale muito a pena estudar este guia: models.py: guia completo para entender e usar corretamente .