2013-08-18 7 views
5

Diciamo che ho un'API in/api/qualcosa. L'API richiede una definizione per a_key, guarda negli argomenti della richiesta e nei cookie. Se trova l'api_key, voglio che passi il parametro api_key ai metodi del percorso, in questo caso something.Flask aggiungi parametro per visualizzare i metodi in before_request

@app.before_request 
def pass_api_key(): 
    api_key = request.args.get('api_key', None) 
    if api_key is None: 
     api_key = request.cookies.get('api_key', None) 
    if api_key is None: 
     return 'api_key is required' 
    # add parameter of api_key to something method 

@app.route('/api/something') 
def something(api_key): 
    return api_key 

È possibile?

Grazie in anticipo.

risposta

8

Un modo per farlo sarebbe utilizzare flask.g. Da the docs:

di condividere i dati che è valido per un solo su richiesta da una funzione all'altra, una variabile globale non è abbastanza buono, perché si spezzerebbe in ambienti filettati. Flask ti fornisce un oggetto speciale che garantisce che sia valido solo per la richiesta attiva e che restituirà valori diversi per ogni richiesta.

Set g.api_key per il valore che si desidera memorizzare in before_request e leggerlo nel metodo di percorso.

0

questo può essere fatto utilizzando la url_value_processor decoratore:

@app.url_value_preprocessor 
def get_project_object(endpoint, values): 
    api_key = values.get('api_key') 
    if api_key is None: 
     api_key = request.cookies.get('api_key', None) 
    if api_key is None: 
     raise Exception('api_key is required') 
    values['api_key'] = api_key 

questo può essere fatto anche in una base Blueprint, in modo che essa si applica solo per il punto di vista del Blueprint specificato.

Problemi correlati