Package: tinyrouter
Tiny RouterTiny Router é um roteador de caminhos para aplicaçõesFlask. A biblioteca centraliza a definição e gerenciamento das rotas utilizadas na aplicação, criar, editar, remover ou trocar controladores facilmente evitando conflitos.Criando rotasRegistrando rotasFunções HelperMétodos HTTPPréfixosDicas de usoCriando rotasUma rota é representada pela classeRoute. Ela possui os seguinte atributos:endpoint- Nome utilizado para identificar a rota. Em caso de endpoints com múltiplos termos, recomendado separá-los por ponto ou sublinhado.rule- Caminho para um recurso específicoview- Função ou classe que irá manipular a requisiçãomethods- Métodos HTTP para chamada da rota (Default:{'GET'})parameters- Parâmetros que podem ser passados na url.Ao criar uma rota apenas são obrigatóriosendpoint,ruleeview.Exemplo de uma rota simples:fromtinyrouterimportRoutefromviewsimportuser_indexRoute('user.index','/user',user_index)Por padrão, as rotas são definidas para aceitas apenas o métodoGET. Entretanto outros métodos podem ser definidos, ou até mais de um.fromtinyrouterimportRoutefromviewsimportuser_index# Definição dos métodosmethods=['GET','POST']Route('user.index','/user',user_index,methods)Registrando as rotasPrimeiro cria-se uma instância do roteadorfromflaskimportFlaskfromtinyrouterimportRouterapp=Flask(__name__)router=Router(app)E invoca o métodoregisterpassando a lista de rotas que deseja registrar na aplicação'''Importaçãoes anteriores'''frommy_app.routesimportroutes'''Instância da aplicação e do roteador'''router.register(routes)Pronto! As rotas agora estão registradas na aplicação.É possível registrar vários grupos de rotas.fromwebapp.routesimportroutesasweb_routesfromapi.routesimportroutesasapi_routesrouter.register(web_routes)router.register(api_routes)Ou ainda...router.register(web_routes,api_routes)Funções HelperMétodos HTTPCriar uma rota que aceite apenas uma método HTTP utilizando Route fica da seguinte forma:# Importação da view...fromtinyrouterimportRouteRoute('cliente.create','/cliente',cliente_create,['POST'])Entretanto esse processo pode ser encurtado com os helpers de métodos.
Utilizando os helpers, o exemplo acima ficaria assim:# Importação da view...fromtinyrouter.helpersimportroute_postaspostpost('cliente.create','/cliente',cliente_create)O resultado será exatamente o mesmo. Os métodos suportados são:GETPOSTPUTDELETEPréfixosAgrupar rotas de acordo com o recurso ou contexto utilizando o Route pode ser um pouco verboso, como por exemplo, rotas associadas ao recurso Cliente.[GET] - /cliente/(Lista todos os Clientes)[POST] - /cliente/(Cria um novo registro de Cliente)[GET] - /cliente/{id}(Recupera um registro específico de Cliente)[PUT] - /cliente/{id}(Atualiza um registro específico de Cliente)[DELETE] - /cliente/{id}(Deleta um registro específico de Cliente )É possível notar que para cada um dos endpoints foi necessário pôr o nome do recurso (Cliente) como préfixo. Utilizando o helper de préfixo esse trabalho não será mais necessário. A função recebe o préfixo a ser adicionado e as rotas que receberão o mesmo. Exemplo:# Importação das viewsfromtinyrouter.helpersimportroute_prefixasprefixfromtinyrouter.helpersimport(route_getasget,\route_postaspost,\route_putasput,\route_deleteasdelete)*prefix('cliente',get('cliente.all','/',cliente_all),post('cliente.create','/',cliente_create),put('cliente.udpate','/<id>',cliente_update),get('cliente.show'),'/<id>',cliente_show),delete('cliente.delete','/<id>',cliente_delete))NOTA:Ao utilizar o route_prefix é necessário pôr um * na frente da função pois é retornado uma coleção de rotas alteradas, e este artifício garante que as rotas serão "desempacotadas". Entretanto não impede que as novas rotas sejam armazenadas em uma variável.É possível também utilizar aninhamentos doroute_prefix# Importações...*prefix('sistema',*prefix('cliente',...))Com isso é possível agrupar diversos contextos com um mesmo préfixo sem a necessidade de definir por extenso um a um.Dicas de UsoUtilizar um arquivo de rotas para cada parte da aplicação. Exemplo:# ./clientes/routes.pyfromtinyrouterimportRoutefrom.viewsroutes=[*route_prefix('/cliente',Route('cliente.index','/',views.index),Route('cliente.show','/<int:id>',views.show),Route('cliente.create','/create',views.create,['GET','POST']))]# ./app.pyfromflaskimportFlaskfromtinyrouterimportRouterfromclientes.routesimportroutesasrotas_clientesapp=Flask(__name__)router=Router(app)router.register(rotas_clientes)