2013-07-25 35 views
5

Cho rằng Flask Routes are not pattern matched from top to bottom, cách thức giải quyết vấn đề sau?Mô hình Tuyến đường Flask Phù hợp với Đơn đặt hàng

tôi có các tuyến đường sau:

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

Nếu tôi thực hiện một yêu cầu đến http://localhost:5000/example-poll-key/close, Flask phù hợp với nó như mô hình 2, gán chuỗi 'gần' đến <participant_key> Tham số URL. Làm thế nào tôi có thể làm cho tuyến đường <poll_key>/close được kết hợp trước tuyến đường <participant_key>?

+0

Thử tạo mẫu tuyến tĩnh trước khung động. Có vẻ như thứ tự quan trọng. – zhangyangyu

Trả lời

4

Xem câu trả lời khác của tôi cho cùng một câu hỏi: https://stackoverflow.com/a/17146563/880326.

Hình như giải pháp tốt nhất là thêm bộ chuyển đổi của riêng bạn và tạo các tuyến đường như

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

nơi no chuyển đổi được xác định

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 

Cập nhật:

Tôi đã bỏ lỡ match_compare_key:

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

Điều này có nghĩa rằng static có ưu tiên cao hơn những người khác và close có ưu tiên cao hơn <participant_key> .

Ví dụ:

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 

đầu ra này:

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

Hình như đây là hành vi đúng.

+0

Cảm ơn lời khuyên hữu ích. Tôi không biết về Converters. Đây là một giải pháp tuyệt vời cho ví dụ đơn giản mà tôi đã hỏi, tuy nhiên tôi có nhiều từ khóa hơn 'đóng' mà tôi không muốn khớp với thành phần url 'participant_key'. Vì vậy, có hiệu quả nói "phù hợp nếu không có trong bộ (đóng, quản trị, thêm, vv)" sẽ nhận được khá lâu. Tôi đã sử dụng [giải pháp RegexConverter] này (http://stackoverflow.com/questions/5870188/does-flask-support-regular-expressions-in-its-url-routing) và đảm bảo thành phần url 'participant_key' của tôi đã có một tiền tố nhất định. – dmoench

+0

Tôi hơi sai, xem cập nhật của tôi. Bạn có thể nhận các giá trị 'arguments' và' _weights' của quy tắc cho hai quy tắc này không? – tbicr