2010-06-09 17 views
9

Sto costruendo un'app utilizzando il framework Web2py ... Non voglio dover usare l'oggetto richiesta per ottenere tutti i parametri di querystring, invece mi piacerebbe costruire il mio controller con i parametri nominati e avere il router decomprimere il dizionario querystring (o dati del modulo) nei parametri nominati e chiama il mio controller.Controller Web2py con parametri?

così invece di un metodo di controllo di

create_user(): 

dove vorrei utilizzare l'oggetto della richiesta globale() e cercare attraverso la lista di Vars ... Io preferirei invece avere

create_user(first_name, last_name, email): 

come vedo in altre piattaforme MVC.

è già possibile in Web2py? o c'è un plugin per questo? o devo aggiungerlo anch'io?

risposta

11

No. Come indicato nella book, un URL della forma

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

mappe all'applicazione (cartelle) a, regolatore (file) c.py, funzione f, e gli argomenti aggiuntivi deve essere scompattato dal richiesta oggetto come

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

Inoltre, web2py rileva in modo specifico le funzioni del controller valide come quelle funzioni che non hanno argomenti. AFAICR, questo è l'opposto di Django che rileva le funzioni del controller valide come quelle che hanno almeno un argomento.

+0

grazie ... Ho capito questo attraverso tentativi ed errori. sarebbe bello se ci fosse qualche possibilità di cambiare comportamento a seconda di come si voleva che funzionasse –

+0

Quanto sopra non è vero nel caso delle funzioni decorate @service. Una funzione di controller con parametri può essere valida quando viene avvolta in questo decoratore. Questo non è lo scenario OP esatto, ma può fornire una soluzione alternativa al suo problema; vedi la mia risposta qui sotto. –

+0

sì libro è 'http: //127.0.0.1: 8000/a/c/f.html/x/y/z? P = 1 & q = 2', ma ottengo i parametri ** dist (request.vars) * * ¿È una cattiva pratica? –

2

faccio

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

ma dispiace che first_name, last_name e-mail possono contenere caratteri non consentiti nel PATH_INFO (web2py in esigente quando la convalida che solo [\ w \ -. \] Sono permessi) .

+0

hey che bello!Sono un principiante di Python ... quindi non mi sono reso conto che un'inizializzazione di questo tipo era possibile. Grazie! –

1

Esiste una circostanza in cui i controller di web2py possono utilizzare i parametri. Quando una funzione controllore ha il decoratore @service, i parametri possono essere utilizzati, a seconda del tipo di servizio, per esempio:

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

Questo approccio è quando una funzione controllore è davvero un'API, non un modo per generare un vista web. Ci sono cose carine che puoi fare in termini di definizione delle funzioni di visualizzazione web e di stile API in parallelo, e che le viste web chiamano le funzioni API, per assicurarti di avere una buona separazione delle unità di controllo &.

A seconda del modo in cui si sceglie di dividere le responsabilità tra il client Web/javascript, la vista web2py e il controller web2py, può avere senso avere funzioni di controllo che sono realmente API (con parametri facoltativi) anziché creare il parametro -unla logica di disimballaggio in un controller in stile vista Web.

Problemi correlati