2010-01-19 10 views
6

Quindi sto usando Django con Google App Engine e ho un file urls.py che reindirizza ogni url a un metodo corrispondente. Ognuno di questi metodi viene automaticamente passato "richiesta" come uno degli argomenti, che credo sia un oggetto HttpRequest.Come posso creare un oggetto richiesta in Django?

Come si crea questo oggetto di richiesta popolato dal mio codice? Ad esempio, se sono all'interno di qualche metodo nel mio codice, mi piacerebbe avere accesso a questo oggetto di richiesta senza doverlo passare ad ogni funzione per assicurarmi che sia disponibile. Supponendo urls.py chiama il metodo foo, il modo in cui sto facendo attualmente è:

foo(request): 
    # stuff here 
    bar(request) 
    # more stuff here 

bar(request): 
    # stuff here<stuff> 
    baz(request) 
    # more stuff here 

baz(request): 
    do something with request here 

Questo sembra sbagliato perché sto dover passare attraverso le funzioni di richiesta che non hanno bisogno solo modo che ho disponibile in baz.

mi piacerebbe fare qualcosa di simile:

foo(request): 
    # stuff here 
    bar() 
    # more stuff here 

bar(): 
    # stuff here 
    baz() 
    # more stuff here 

baz(): 
    request = HttpRequest() 
    do something with request here 

cioè non passano richiesta in giro se non devo. Tuttavia, facendo request = HttpRequest() restituisce un oggetto richiesta vuoto ... quello che voglio è una versione completamente popolata, come quello che viene passato in ogni metodo chiamato da urls.py.

Ho dato un'occhiata alla documentazione di HttpRequest qui: http://docs.djangoproject.com/en/dev/ref/request-response/ ma non ho visto il modo di farlo.

Ogni pensiero sarebbe molto apprezzato.

Grazie, Ryan

risposta

0

Basta creare una variabile di richiesta prima che le definizioni di visualizzare e impostare il suo valore quando si riceve dalla visualizzazione (utilizzando il codice di esempio):

current_request = None 

foo(request): 
    current_request = request 
    # stuff here 
    bar() 
    # more stuff here 

bar(): 
    # stuff here 
    baz() 
    # more stuff here 

baz(): 
    # do something with currest_request here 

See: Notes on Python variable scope

Aggiornamento:This question è molto simile al tuo e la soluzione accettata è fondamentalmente la creazione di una variabile di richiesta globale e in rimettendolo in tilt alle impostazioni.

+0

dispiace Lance, non credo di aver fatto un buon lavoro che spiega quale sia il problema era nel mio post originale. Da allora l'ho aggiornato ... speriamo sia più chiaro ora. – ryan

+1

Continuo a pensare che la domanda abbia a che fare con lo scope variabile. Ho aggiornato la mia risposta per utilizzare una variabile globale. –

+0

Grazie Lance. Le mie funzioni sono tutte in diversi file .py e davvero non voglio seguire il percorso dell'utilizzo di una variabile globale. – ryan

1

request = HttpRequest() ti darà uno vuoto, ma puoi scriverci qualcosa.

Ecco un esempio che ho usato nel mio progetto:

def new(request): 
    ... 
    newrequest = HttpRequest() 
    newrequest.method = 'GET' 
    newrequest.user = request.user 
    resp = result_email(newrequest , obj-id , token) 
    send_email(resp , ...) 
    return HttpResponseRedirect(...) 
    ... 
def result_email(request , ...): 
    ... 
    return render(request , ...) 
Problemi correlati