Controladores Web2py com parâmetros?
Pergunta
Estou construindo um aplicativo usando a estrutura Web2py ... Não quero usar o objeto de solicitação para obter todos os parâmetros de consulta, em vez disso, gostaria de construir meu controlador com parâmetros nomeados e fazer com que o roteador descompacte o querystring (ou dados de formulário) Dicionário nos parâmetros nomeados e chama meu controlador.
Então, em vez de um método controlador de
create_user():
onde eu usaria o objeto global request () e procuraria a lista de vars ... eu preferiria ter
create_user(first_name, last_name, email):
Como eu vejo em outras plataformas MVC.
Isso já é possível no web2py? Ou existe um plugin para isso? Ou preciso adicionar isso sozinho?
Solução
Não. Conforme declarado no livro, um URL da forma
http://127.0.0.1:8000/a/c/f.html/x/y/z?p=1&q=2
Mapas para aplicação (pasta) a
, controlador (arquivo) c.py
, função f
, e os argumentos adicionais devem ser descompactados do objeto de solicitação como
x, y, z = tuple(request.args)
p = request.vars['p'] # p=1
q = request.vars['q'] # q=2
Além disso, o Web2py detecta especificamente as funções do controlador válido como as funções que não têm argumentos. AFAICR, isso é oposto ao Django, que detecta funções válidas do controlador como aquelas que têm pelo menos um argumento.
Outras dicas
Eu faço
def create_user():
try:
first_name, last_name, email = request.args[:3]
except:
redirect('some_error_page')
Mas lembre-se de que o First_Name, Last_Name e Email podem conter chars que não são permitidos no path_info (Web2py em exigente ao validar que apenas [ w -.] são permitidos).
Há uma circunstância em que os controladores Web2py podem usar parâmetros. Quando uma função do controlador possui o Decorador do @Service, os parâmetros podem ser usados, dependendo do tipo de serviço, por exemplo:
@service.jsonrpc
def somefunction(a=None, b='default'):
## whatever
Essa abordagem é para quando uma função de controlador é realmente uma API, não uma maneira de gerar uma visualização da Web. Há coisas boas que você pode fazer em termos de definição de funções de visualização da web e estilo API em paralelo, e fazer com que as visualizações da Web chamem as funções da API, para garantir que você tenha uma boa separação de visualizações e controladores.
Dependendo de como você optar por dividir responsabilidades entre o cliente da Web / JavaScript, a visualização Web2py e o controlador Web2py, pode fazer sentido ter funções de controlador que são realmente APIs (com parâmetros opcionais) em vez de criar a lógica de embalagem de parâmetros em um controlador de estilo de visão da web.