; poll_key> /< participant_key> :(True,-2,[(1,100),(1,100)])
/ li>
这意味着 static
具有比其他更高的优先级,靠近
具有比< participant_key>
更高的优先级。
示例:
from flask import Flask
$ b $ 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()
打印client.get('/ example-poll-key / close')。data
print client.get('/ example-poll-key / example-participant-key')。data
<
这个输出:关闭{'poll_key':u'example-poll-key'}
p_key {'participant_key':u'example-participant-key','poll_key':u'example-poll-key'}
看起来这是正确的行为。
Given that Flask Routes are not pattern matched from top to bottom, how does one deal with the following problem?
I have the following routes:
/<poll_key>/close
/<poll_key>/<participant_key>
If I make a request to http://localhost:5000/example-poll-key/close
, Flask matches it as pattern 2, assigning the string 'close' to the <participant_key>
URL parameter. How can I make the <poll_key>/close
route get matched before the <participant_key>
route?
解决方案
See my other answer to the same question: https://stackoverflow.com/a/17146563/880326.
Looks like the best solution is to add your own converters and create routes as
/<poll_key>/close
/<poll_key>/<no(close):participant_key>
where the no
converter is defined
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:
I missed match_compare_key
:
- for
static
endpoint: (True, -2, [(0, -6), (1, 200)])
- for
/<poll_key>/close
: (True, -2, [(1, 100), (0, -5)])
- for
/<poll_key>/<participant_key>
: (True, -2, [(1, 100), (1, 100)])
This means that static
has higher priority than the others and close
has higher priority than <participant_key>
.
Example:
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 outputs:
close {'poll_key': u'example-poll-key'}
p_key {'participant_key': u'example-participant-key', 'poll_key': u'example-poll-key'}
Looks like this is the right behaviour.
这篇关于烧瓶路由模式匹配顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文