2013-07-25 10 views
5

Dato che Flask Routes are not pattern matched from top to bottom, come si fa ad affrontare il seguente problema?Ordine di abbinamento del percorso del percorso del pallone

ho i seguenti itinerari:

  1. /<poll_key>/close
  2. /<poll_key>/<participant_key>

Se faccio una richiesta di http://localhost:5000/example-poll-key/close, Flask lo confronta come modello 2, assegnando la stringa 'vicino' al <participant_key> Parametro URL. Come posso far corrispondere il percorso <poll_key>/close prima del percorso <participant_key>?

+0

Provare a creare il modello di percorso statico prima di quello dinamico. Sembra che l'ordine sia importante. – zhangyangyu

risposta

4

Vedere la mia altra risposta alla stessa domanda: https://stackoverflow.com/a/17146563/880326.

Sembra che la soluzione migliore è quella di aggiungere i propri convertitori e creare percorsi come

/<poll_key>/close 
/<poll_key>/<no(close):participant_key> 

cui è definito il convertitore no

class NoConverter(BaseConverter): 

    def __init__(self, map, *items): 
     BaseConverter.__init__(self, map) 
     self.items = items 

    def to_python(self, value): 
     if value in self.items: 
      raise ValidationError() 
     return value 

Aggiornamento:

Mi sono perso match_compare_key:

  1. per static endpoint: (True, -2, [(0, -6), (1, 200)])
  2. per /<poll_key>/close: (True, -2, [(1, 100), (0, -5)])
  3. per /<poll_key>/<participant_key>: (True, -2, [(1, 100), (1, 100)])

Questo significa che static ha priorità più alta rispetto agli altri e close ha priorità maggiore rispetto <participant_key> .

Esempio:

from flask import Flask 

app = Flask(__name__) 
app.add_url_rule('/<poll_key>/close', 'close', 
       lambda **kwargs: 'close\t' + str(kwargs)) 
app.add_url_rule('/<poll_key>/<participant_key>', 'p_key', 
       lambda **kwargs: 'p_key\t' + str(kwargs)) 


client = app.test_client() 

print client.get('/example-poll-key/close').data 
print client.get('/example-poll-key/example-participant-key').data 

This uscite:

close {'poll_key': u'example-poll-key'} 
p_key {'participant_key': u'example-participant-key', 'poll_key': u'example-poll-key'} 

Sembra che questo è il comportamento giusto.

+0

Grazie per il suggerimento utile. Non sapevo di Converters. Questa è stata un'ottima soluzione per l'esempio semplificato che ho chiesto, tuttavia ho molte più parole chiave di "close" che non volevo abbinare al componente url "participant_key'. Dire in modo efficace che "match if not in the set (close, admin, add, etc)" sarebbe piuttosto lungo. Ho finito per usare questa [soluzione RegexConverter] (http://stackoverflow.com/questions/5870188/does-flask-support-regular-expressions-in-its-url-routing) e assicurarmi che il mio componente url 'participant_key' avesse un certo prefisso. – dmoench

+0

Ero un po 'sbagliato, vedi il mio aggiornamento. Puoi ottenere le regole 'arguments' e' _weights' per queste due regole? – tbicr

Problemi correlati