2013-07-25 2 views
5

Учитывая, что Flask Routes are not pattern matched from top to bottom, как решить следующую проблему?Образец шаблона фляжки Соответствующий заказ

У меня есть следующие маршруты:

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

Если я сделать запрос на http://localhost:5000/example-poll-key/close, Колба матчи как шаблон 2, назначая строку 'закрыть' к <participant_key> Параметр URL. Как я могу настроить маршрут <poll_key>/close до маршрута <participant_key>?

+0

Попробуйте создать шаблон статического маршрута перед динамическим. Кажется, порядок имеет значение. – zhangyangyu

ответ

4

См. Мой другой ответ на тот же вопрос: https://stackoverflow.com/a/17146563/880326.

Похоже, лучшим решением является добавление собственных конвертеров и создавать маршруты, как

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

, где определен 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 

Update:

Я пропустил match_compare_key:

  1. для static конечной точки: (True, -2, [(0, -6), (1, 200)])
  2. для /<poll_key>/close: (True, -2, [(1, 100), (0, -5)])
  3. для /<poll_key>/<participant_key>: (True, -2, [(1, 100), (1, 100)])

Это означает, что static имеет более высокий приоритет, чем другие, и close имеет более высокий приоритет, чем <participant_key> ,

Пример:

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 

В этом выходы:

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

Похоже, это правильное поведение.

+0

Спасибо за полезный совет. Я не знал о Конвертерах. Это было отличное решение для упрощенного примера, о котором я спрашивал, однако у меня есть гораздо больше ключевых слов, чем «close», что я не хотел сопоставлять компонент URL-адреса участника_частника. Так эффективно сказать: «матч, если не в наборе (закрыть, админ, добавить и т. Д.)», Будет довольно длинным. Я закончил использование этого [RegexConverter solution] (http://stackoverflow.com/questions/5870188/does-flask-support-regular-expressions-in-its-url-routing) и убедился, что компонент URL-адреса 'member_key' определенный префикс. – dmoench

+0

Я был немного неправ, см. Мое обновление. Можете ли вы получить значения правил 'arguments' и' _weights' для этих двух правил? – tbicr

Смежные вопросы