Skip to content

Instantly share code, notes, and snippets.

@acwoss
Last active November 28, 2017 23:11
Show Gist options
  • Save acwoss/14d23c09ecbec4be0105df00e349d80c to your computer and use it in GitHub Desktop.
Save acwoss/14d23c09ecbec4be0105df00e349d80c to your computer and use it in GitHub Desktop.
Requisitos iniciais para a classe Routes

class Routes

A classe Routes implementará uma interface para a definição de rotas da aplicação. Uma rota será representada por três elementos básicos: o método HTTP definido na requisição, o valor de path da URI da requisição e um objeto callable, que será executado quando a rota ser requisitada.

Requisitos

  1. O desenvolvedor poderá definir uma nova rota baseada no método GET do protocolo HTTP utilizando o decorador @routes.get;

    routes = Routes()
    
    @routes.get('/blog')
    def blog(request):
        ...
  2. O desenvolvedor poderá definir uma nova rota com quaiquer outros métodos HTTP de forma semelhante ao GET, sendo eles HEAD, POST, PUT, DELETE, CONNECT, OPTIONS e TRACE;

  3. O desenvolvedor poderá definir uma nova rota baseada em múltiplos métodos HTTP utilizando o decorador @routes.any;

    routes = Routes()
    
    @routes.any({'get', 'head'}, '/blog')
    def blog(request):
        ...
  4. O desenvolvedor poderá definir uma nova rota a partir de métodos personalizados utilizando, também, o decorador @routes.any;

    routes = Routes()
    
    @routes.any({'list'}, '/blog')
    def blog(request):
        ...
  5. O desenvolvedor poderá definir, através do construtor do objeto routes, um prefixo de rota, que deverá ser aplicado em todas as rotas definidas pelo objeto;

    routes = Routes(prefix='site')
    
    @routes.get('/blog')
    def blog(request):
        ...
  6. O desenvolvedor poderá definir rotas dinâmicas baseadas em expressões regulares. As expressões regulares deverão estar entre chaves e dois pontos, {::};

    a. O conteúdo entre as chaves deverá ser tratado, pela aplicação, como uma string crua;

    @routes.get(r'/users/{:/[0-9]*/:}')

    b. Cada bloco de expressão regular presente na rota poderá possuir um nome definido entre as chaves, prescedendo a expressão regular, separada desta por sinais de menor e maior, <>;

    @routes.get('/users/{:<id>/[0-9]*/:}')

    c. Se só houverem valores não nomeados na rota, todos deverão ser passados para o objeto callable de forma posicional;

    @routes.get('/posts/{:/\d{4}/:}/{:/\d{2}/:}/{:/\d{2}/:}')
    def posts(request, year, month, day):
    	...

    d. Se só houverem valores nomeados na rota, todos deverão ser passados para o objeto callable como parâmetros nomeados;

    @routes.get('/posts/{:<day>/\d{2}/:}/{:<month>/\d{2}/:}/{:<year>/\d{4}/:}')
    def posts(request, year, month, day):
    	...

    e. Se houverem tanto valores nomeados como não nomeados na rota, necessariamente os valores não nomeados deverão estar antes de qualquer valor nomeado e deverão ser passados pela aplicação para o objeto callable de forma posicional. Todos os valores nomeados serão passados como parâmetros nomeados ao objeto callable;

    @routes.get('/posts/{:/\d{4}/:}/{:<day>/\d{2}/:}/{:<month>/\d{2}/:}')
    def posts(request, year, month, day):
    	...

    f. Todos os valores não nomeados da rota poderão ser acessados via *args, enquanto todos os valores nomeados poderão ser acessados via **kwargs;

    @routes.get('/posts/{:/\d{4}/:}/{:<day>/\d{2}/:}/{:<month>/\d{2}/:}')
    def posts(request, *args, **kwargs):
    	print(args)  # ['2017']
        print(kwargs)  # {'day': '28', 'month': '11'}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment