Django: URLs – Parte 01

Para arquitetar as URLs do seu projeto Django, criamos um módulo de Python informalmente chamado URLconf. URLconfs são como Django associa uma URL com um determinado código a ser executado (no caso, nossas views).

Quando o usuário acessa uma página, o sistema confere a varíavel ROOT_URLCONF no arquivo setting.py, que contém o nome do módulo que deverá ser executado. Ao executar esse módulo, ele carrega uma variável chamada urlpatterns que contém a lista de todas as nossas urls.

Quando nós criamos um projeto rodando o django-admin.py startproject MeuProjetoIncrivel, é criado automaticamente a URLconf em MeuProjetoIncrivel/url.py e, também automaticamente, é definida a setting ROOT_URLCONF (em MeuProjetoIncrivel/settings.py) para indicar nosso arquivo url.py:

ROOT_URLCONF = 'MeuProjetoIncrivel.urls'

Tudo muito fácil e perfeito. Agora é nossa vez de trabalhar! Visualizando o que temos no arquivo url.py e desconsiderando as linhas comentadas (que servirão para habilitar o admin e a documentação do admin), veremos o seguinte código:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
)
  • A primeira linha importa alguns objetos de django.conf.urls import patterns, incluindo uma função chamada patterns.
  • A segunda linha chama a função patterns e salva o retorno na variável urlpatterns. Nós iremos alterar o parâmetro da função para inserirmos nossas urls.

A url que nós certamente queremos alterar é do root do nosso site. Então primeiramente acrescentaremos o seguinte código:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
(r'^$', 'app.views.view_da_minha_homepage'),
# ...
)

Explicação:

  • O “r” inicial de cada expressão regular é opcional, mas recomendada. Ela diz que uma string é “raw” e não deve ser “escapada”. Ou seja, quando tiver um “\t” na string, ela deve ser lida como “barra-tê” ao invés de virar um tab.
  • O acento circunflexo (^) e o cifrão ($) são caracteres que indicam que o padrão combine exatamente com o começo da string (^) e com o final ($).

Exemplos: Se nós temos uma url ‘^exemplo/’ (sem o $ no final), então qualquer URL que comece com /exemplo/ vai ser reconhecida, como /exemplo/foo ou /exemplo/bar, não apenas /hello/. Da mesma forma, se nós tirarmos o circunflexo (i.e. ‘exemplo/$’), Django vai reconhecer qualquer url terminada em exemplo/, como /foo/exemplo e /bar/exemplo. E, finalmente, se deixarmos a url só como ‘exemplo/‘ qualquer url que tenha ‘exemplo/‘ no meio vai ser aceita (foo/exemplo/bar, foo/bar/exemplo, exemplo/foo, etc).

Agora, imagine que tenhamos um blog no MeuProjetoIncrivel, cuja url será /blog/. Para mapearmos essa url, basta acrescentar no nosso código:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
(r'^$', 'app.views.view_da_minha_homepage'),
(r'^blog/$', 'app.views.view_do_meu_blog'),
# ...
)

Assim estamos informando que toda solicitação ao root do projeto (digamos, um endereço como http://www.meuprojetoincrivel.com.br) deve ser encaminhada para a app.views.view_da_minha_homepage e toda solicitação ao blog/ (www.meuprojetoincrivel.com.br/blog) deve ir para view_do_meu_blog.

Agora imagine que escolhemos ter um id para cada postagem, como nas url blog/45/ e blog/9/. Bastaria adicionarmos o seguinte código:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
(r'^$', 'app.views.view_da_minha_homepage'),
(r'^blog/$', 'app.views.view_do_meu_blog'),
(r'^blog/\d+/$', 'app.views.view_do_meu_post'),
# ...
)

O \d+ é uma expressão regular que indica que a url pode ser compatível, naquele espaço, com um ou mais dígitos (1 ou 1000000000). Se quiséssemos limitar esse número até a postagem 999 (três dígitos), bastaria usarmos a expressão \d{1,3}.

Já conseguimos mapear a url do post, mas ainda não passamos o id do post para a view tratar. Para fazermos isso, basta colocarmos a expressão entre parênteses, assim:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
(r'^$', 'app.views.view_da_minha_homepage'),
(r'^blog/$', 'app.views.view_do_meu_blog'),
(r'^blog/(\d+)/$', 'app.views.view_do_meu_post'),
# ...
)

Entretando dessa forma estamos obrigando nossa view a receber os argumentos dela obrigatoriamente na ordem em que são passadas. Para evitarmos isso e facilitarmos possíveis manutenções no código, vamos passar nossos argumentos já nomeados. Para isso basta alterar no (/d+) para ficar assim:

from django.conf.urls import patterns, include, url

urlpatterns = patterns('',
(r'^$', 'app.views.view_da_minha_homepage'),
(r'^blog/$', 'app.views.view_do_meu_blog'),
(r'^blog/(?P<post_id>\d+)/$', 'app.views.view_do_meu_post'),
# ...
)

E assim já temos o básico de informação para construir nossas urls =)


Fontes: Documentação Oficial do Django e Django Book

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: