Arquivos Mensais: junho \29\UTC 2012

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

Configurando roteador com internet da GVT

Esse ano me bati feio para conseguir configurar dois roteadores. Decorei manuais, implorei ajuda ao Google, mas só recentemente descobri que um detalhe importantíssimo, como explica o Blog do Luguta:

O modem da GVT já vem configurado da prestadora como servidor DHCP. A faixa de IP usada por eles no modem é a 192.168.1.x. O modem deles vem com o IP fixo de 192.168.1.1 e é aí que mora o problema! A grande maioria dos roteadores do mercado vem configurado com esse mesmo endereço IP, e está configurado para distribuir IPs nessa mesma faixa.

Os roteadores que eu consegui configurar foram Multilaser Wireless 150Mb e o Tp-Link TL-WR941N.

Roteador

Aqui está o pass-a-passo:

Continuar Lendo →