2011-08-17 17 views
17

Sembra che Flask non supporti rotte con un componente con codifica URI. Sono curioso di fare qualcosa di sbagliato, o se c'è una bandiera speciale che devo includere.Percorso pallone con componente codificato URI

mio percorso simile a questa:

@app.route('/foo/<encoded>/bar/') 
def foo(encoded): 
    # ... 
    pass 

L'URL che questo deve corrispondere può apparire come questi:

http://foobar.com/foo/xxx/bar/ # matched correctly, no URI component 
http://foobar.com/foo/x%2Fx%2Fx%2F/bar/ # not matched correctly, URI component 

Ex opere URL, quest'ultimo sputa fuori un bel 404.

Grazie!

risposta

24

Add path per la regola url:

@app.route('/foo/<path:encoded>/bar/')

Aggiornamento per commentare: la documentazione API percorso sono qui: http://flask.pocoo.org/docs/api/#flask.Flask.route. Le classi di base che implementano il convertitore percorso path stile sono qui: http://werkzeug.pocoo.org/docs/routing/#custom-converters (. Questo è uno dei davvero belle parti del pocoostan) Per quanto riguarda la finale barre, ci sono delle regole speciali che ammontano a:

Se un la regola termina con una barra e viene richiesta senza una barra da parte dell'utente , l'utente viene automaticamente reindirizzato alla stessa pagina con una barra finale allegata .

Se una regola non termina con una barra finale e l'utente richiede la pagina con una barra finale, viene generato un 404 non trovato.

Anche tenere a mente che se siete su Apache e aspettate un URL slash-trainati, vale a dire un bookmarklet che sottopone http://ex.com/foo/<path:encoded>/bar e encoded ottiene qualcosa con doppie barre, Apache convertire più tagli a uno solo.

+0

Rad, che lo ha risolto. – sholsapp

+3

Nel caso in cui qualcun altro abbia lo stesso problema: mi ci è voluto un minuto per capire che stavamo aggiungendo 'path', non aggiungendo' encoded'. Ho provato e non sono riuscito ad aggiungere un post-filtro 'codificato' piuttosto che un pre-filtro' path'. – gwg

+0

io e te entrambi! –

Problemi correlati