2010-06-09 20 views
9

Estoy construyendo una aplicación usando el framework Web2py ... No quiero tener que usar el objeto request para obtener todos los parámetros de la cadena de consulta, en cambio me gustaría construir mi controlador con parámetros nombrados y tener el enrutador desempaquetar el diccionario querystring (o form data) en los parámetros nombrados y llama a mi controlador.Controladores Web2py con parámetros?

así que en vez de un método de control de

create_user(): 

dónde iba a utilizar el objeto solicitud global() y mirar a través de la lista de Vars ... yo preferiría en lugar de tener

create_user(first_name, last_name, email): 

como veo en otras plataformas MVC.

¿esto ya es posible en Web2py? o hay un plugin para ello? o ¿tengo que agregar eso yo mismo?

Respuesta

11

No. Como se afirma en el book, una dirección URL de la forma

http://127.0.0.1:8000/a/c/f.html/x/y/z?p=1&q=2 

mapas de la aplicación (carpeta) a, el controlador (archivo) c.py, f de función, y los argumentos adicionales debe ser desempaquetado del objeto de solicitud como

x, y, z = tuple(request.args) 
p = request.vars['p'] # p=1 
q = request.vars['q'] # q=2 

Además, web2py detecta específicamente las funciones de controlador válidas como aquellas funciones que no tienen argumentos. AFAICR, esto es opuesto a Django que detecta funciones de controlador válidas como aquellas que tienen al menos un argumento.

+0

gracias ... He estado averiguando esto a través de prueba y error. sería bueno si hubiera alguna opción para cambiar el comportamiento según cómo quisiera que funcione –

+0

Lo anterior no es cierto en el caso de las funciones decoradas @servicio. Una función de controlador con parámetros puede ser válida cuando se envuelve en este decorador. Este no es el escenario OP exacto pero puede proporcionar una solución alternativa a su problema; ver mi respuesta a continuación. –

+0

sí, el libro es 'http: //127.0.0.1: 8000/a/c/f.html/x/y/z? P = 1 & q = 2', pero obtengo los parámetros ** dist (request.vars) * * ¿Es una mala práctica? –

2

hago

def create_user(): 
    try: 
     first_name, last_name, email = request.args[:3] 
    except: 
     redirect('some_error_page') 

pero me importa que nombre, apellido y correo electrónico puede contener caracteres que no están permitidos en el PATH_INFO (web2py en el exigente al validar que solo [\ w \ -. \] Están permitidos) .

+0

hey eso es genial!Soy un novato de pitón ... así que no me di cuenta de que era posible una inicialización. ¡Gracias! –

1

Hay una circunstancia en la que los controladores web2py pueden usar parámetros. Cuando una función controlador tiene el decorador @Service, los parámetros se pueden utilizar, dependiendo del tipo de servicio, por ejemplo:

@service.jsonrpc 
def somefunction(a=None, b='default'): 
    ## whatever 

Este enfoque es para cuando una función de controlador es realmente una API, no una forma de generar una vista web Hay cosas buenas que puede hacer en términos de definir funciones de vista web y estilo API en paralelo, y hacer que las vistas web llamen a las funciones API para garantizar una buena separación de las vistas & controladores.

Dependiendo de cómo elija dividir responsabilidades entre el cliente web/javascript, la vista web2py y el controlador web2py, puede tener sentido tener funciones de controlador que sean verdaderamente API (con parámetros opcionales) en lugar de construir el parámetro -la lógica de empaque en un controlador de estilo de vista web.