2011-11-09 2 views
9

Sto scrivendo un'app in cui gli utenti saranno in grado di memorizzare le informazioni per cui possono specificare un'interfaccia REST. IE, memorizzare un elenco di prodotti a /<username>/rest/products. Poiché gli URL non sono ovviamente noti prima mano, stavo cercando di pensare al modo migliore per implementare la creazione di URL dinamici in Flask. Il primo modo in cui ho pensato sarebbe scrivere una regola catch-all e indirizzare l'URL da lì. Ma in pratica sto duplicando le funzionalità di routing degli URL quando Flask le ha già integrate. Quindi, mi chiedevo se sarebbe stata una cattiva idea usare .add_url_rule() (docs here, scorrere verso il basso un po ') per collegarli direttamente all'app. C'è una ragione specifica per cui questo non dovrebbe essere fatto?Aggiungere dinamicamente le regole URL all'app Flask

risposta

12

Ogni volta che si esegue add_url_rule() l'instradamento interno rimappa nella mappa URL. Questo non è né sicuro né veloce. Al momento non capisco perché tu abbia bisogno di regole URL specifiche dell'utente per essere onesto. Sembra davvero che tu voglia montare applicazioni specifiche per l'utente?

Forse questo è utile: http://flask.pocoo.org/docs/patterns/appdispatch/

+0

Ho lo stesso requisito, cioè sto cercando un modo per aggiungere dinamicamente nuovi endpoint a un'API costruita con [Eve] (http://python-eve.org) usando il suo metodo 'register_resource', che chiama' add_url_rule' internamente. Si noti che ciò non si verificherà per ogni richiesta, ma verrà attivato da un hook quando viene ricevuto un 'POST' a un endpoint specifico, pertanto le prestazioni non dovrebbero costituire un problema. – kynan

+0

Esattamente lo stesso requisito qui. Api, che ha bisogno di aggiungere e rimuovere una nuova rotta ogni volta che una richiesta PUT si verifica in un determinato percorso. Nel mio caso sto usando il pallone riposante, ma fondamentalmente è lo stesso. – cllamach

+0

Sembra che possa farlo in before_request se utilizzo threading.lock, tuttavia, non sono sicuro su come arrestare i problemi con url_per avere il seguente errore: ValueError: lista modificata durante l'ordinamento ERRORE: app: Errore interno del server, lista modificata durante l'ordinamento – pip

0

ho avuto requisito analogo per la mia applicazione in cui ciascun endpoint /<SOMEID>/rest/other per data SOMEID dovrebbe essere limitato ad una funzione diversa. Un modo per ottenere ciò è mantenere un dizionario di ricerca in cui i valori sono la funzione che gestisce lo specifico SOMEID. Per esempio dare un'occhiata a questo frammento:

func_look_up_dict = {...} 
@app.route('<SOMEID>/rest/other', methods=['GET']) 
def multiple_func_router_endpoint(SOMEID): 
    if SOMEID in func_look_up_dict.keys(): 
     return jsonify({'result' = func_look_up_dict[SOMEID]()}), 200 
    else: 
     return jsonify({'result'='unknown', 'reason'='invalid id in url'}), 404 

quindi per questa cura non si ha realmente bisogno di "dinamicamente" aggiungere le regole URL, ma piuttosto utilizzare una regola URL con parametri e gestire i vari casi withing un singolo funzione. Un'altra cosa da considerare è pensare veramente al caso d'uso di tale endpoint URL. Se <username> è un parametro che deve essere passato, perché non utilizzare una regola di url come /rest/product/<username> o passarla come argomento nella richiesta GET? Spero che questo aiuti.