2010-06-09 7 views
9

Je construis une application en utilisant le framework Web2py ... Je ne veux pas utiliser l'objet request pour obtenir tous les paramètres de la chaîne de requête, mais je voudrais construire mon contrôleur avec des paramètres nommés et faire décompacter le routeur le dictionnaire querystring (ou données de formulaire) dans les paramètres nommés et appelez mon contrôleur.Contrôleurs Web2py avec paramètres?

donc au lieu d'une méthode de commande de

create_user(): 

où j'utiliser l'objet demande globale() et consultez la liste vars ... Je préférerais plutôt avoir

create_user(first_name, last_name, email): 

comme je vois dans d'autres plates-formes MVC.

est-ce possible dans Web2py déjà? ou y a-t-il un plugin pour cela? ou dois-je l'ajouter moi-même?

Répondre

11

Non Comme indiqué dans le book, une URL de la forme

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

cartes à l'application (dossier) a, contrôleur (fichier) c.py, fonction f, et les arguments supplémentaires doivent être décompressé de la objet de requête comme

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

en outre, web2py détecte spécifiquement les fonctions de contrôleur valides que les fonctions qui ont pas d'arguments. AFAICR, ceci est à l'opposé de Django qui détecte des fonctions de contrôleur valides comme celles qui ont au moins un argument.

+0

merci ... Je l'ai compris par essais et erreurs. serait bien s'il y avait une option pour changer le comportement en fonction de la façon dont vous vouliez que cela fonctionne –

+0

Ce qui précède n'est pas vrai dans le cas des fonctions @service décorées. Une fonction de contrôleur avec des paramètres peut être valide lorsqu'elle est enveloppée dans ce décorateur. Ce n'est pas le scénario OP exact mais peut fournir une solution alternative à son problème; voir ma réponse ci-dessous. –

+0

oui livre est 'http: //127.0.0.1: 8000/a/c/f.html/x/y/z? P = 1 & q = 2', mais je reçois les paramètres ** dist (request.vars) * * ¿Est une mauvaise pratique? –

2

je

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

mais l'esprit que prenom, last_name et le courrier électronique peut contenir des caractères qui ne sont pas autorisés dans le path_info (web2py dans pointilleux lors de la validation que seul [\ w \ -. \] Sont autorisés) .

+0

hey c'est cool!Je suis un novice en python ... donc je ne me suis pas rendu compte qu'une petite initialisation était possible. Merci! –

1

Il existe une circonstance dans laquelle les contrôleurs web2py peuvent utiliser des paramètres. Lorsqu'une fonction de contrôleur a le décorateur @service, les paramètres peuvent être utilisés, en fonction du type de service, par exemple:

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

Cette approche est quand une fonction de contrôleur est vraiment une API, pas un moyen de générer un vue web Il y a de belles choses que vous pouvez faire en termes de définition de fonctions de vue Web et de style API en parallèle, et que les vues web appellent les fonctions de l'API, pour vous assurer une bonne séparation des vues & contrôleurs. En fonction de la manière dont vous choisissez de répartir les responsabilités entre le client Web/javascript, la vue web2py et le contrôleur web2py, il peut être logique d'avoir des fonctions de contrôleur qui sont réellement des API (avec des paramètres optionnels) plutôt que de construire le paramètre -unpackage logique dans un contrôleur de style Web-vue.