Curso web2py

Personalizando rotas

Como você viu, mapeamos nossas páginas de acordo com o nome da aplicação e os respectivos controller e função da página que abrimos. Porém, quando formos deixar essa aplicação acessível ao público, vamos querer uma URL simples e de fácil entendimento. Por isso, podemos alterar o mapeamento de rotas para as nossas páginas, de forma a deixar nossas URLs mais agradáveis.

As rotas podem ser alteradas a partir de um arquivo routes.py que deve ficar na raiz da pasta descompactada do web2py. É possível encontrar uma base para esse arquivo em examples/routes.parametric.example.py ou examples/routes.patterns.example.py, dependendo da opção de roteamento que escolher.

Admita que tenhamos , em um controller default, a página registrar_gato.

Parameter-based System

É a primeira forma que temos de reescrever nossas rotas. Com esse sistema, é possível omitir a aplicação e o controller padrão da URL, mapear domínios diferentes para diferentes aplicações ou controllers, adicionar um seletor de linguagem na URL, entre outros.

O mais interessante aqui é poder retirar o nome da apliação e do controller da URL, deixando apenas o nome da página visível. Dessa forma, ao invés de uma URL:

http://dominio.com/meu_app/default/registrar_gato

Posso ter apenas:

http://dominio.com/registrar_gato

Isso pode ser feito facilmente reescrevendo o arquivo routes.py da seguinte maneira:

routers = dict(
  BASE  = dict(default_application='sua_app',
                default_controller='default'),
)

Assim, quando a aplicação padrão e o controller padrão forem chamados, ambos serão omitidos da URL.

Pattern-based System

Esse sistema é recomendado para casos mais complexos, onde não queremos deixar a URL somente limpa e amigável, mas sim promover grandes alterações nela.

Para utilizar o Pattern-based System é necessário definir duas tuplas, uma routes_in e outra routes_out. A tupla de routes_in é a tradução da URL digitada em uma função, ou seja, é ela que vai falar para qual função determinada URL aponta. Já a tupla de routes_out faz exatamente o contrário, fala pra qual URL determinada função aponta.

routes_in = (
  ('/registrar', '/sua_app/default/registrar_gato'),
)
routes_out = (
  ('/sua_app/default/registrar_gato', '/registrar'),
)

Assim, sempre que acessarmos http://dominio.com/registrar, seremos encaminhados para a função registrar_gatos.

Esse sistema utiliza o padrão de expressões regulares do Python para reescrever as URLs. Por exemplo, caso você queira receber um argumento nessa função:

routes_in = (
  ('/registrar/$argumento', '/sua_app/default/registrar_gato/$argumento'),
)
routes_out = (
  ('/sua_app/default/registrar_gato/$argumento', '/registrar/$argumento'),
)