Flask是否支持URL路由中的正则expression式?

我明白Flask具有int,float和path转换器,但是我们正在开发的应用程序在其URL中有更复杂的模式。

有没有像Django中使用正则expression式的方法?

  • 在Ubuntu中使用带有Visual Studio代码的Python的Virtualenv
  • 通过MAPI使用Python从Outlook中阅读电子邮件
  • Python语言的isPrime函数
  • pip安装在全球网站包,而不是virtualenv
  • 在Python中随机化string列表的最佳方法
  • 如何在django queryset中执行OR条件?
  • Python请求 - 打印整个HTTP请求(原始)?
  • Pythondate时间对象显示错误的时区偏移量
  • 3 Solutions collect form web for “Flask是否支持URL路由中的正则expression式?”

    尽pipeArmin用一个可以接受的答案打败了我,但我想我会展示一个简单的例子,说明如何在Flask中实现一个正则expression式匹配器,以防万一任何人想要这样做的工作示例。

    from flask import Flask from werkzeug.routing import BaseConverter app = Flask(__name__) class RegexConverter(BaseConverter): def __init__(self, url_map, *items): super(RegexConverter, self).__init__(url_map) self.regex = items[0] app.url_map.converters['regex'] = RegexConverter @app.route('/<regex("[abcABC0-9]{4,6}"):uid>-<slug>/') def example(uid, slug): return "uid: %s, slug: %s" % (uid, slug) if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=5000) 

    这个URL应该返回200: http:// localhost:5000 / abc0-foo /

    这个URL应该会返回404: http:// localhost:5000 / abcd-foo /

    您可以挂钩自定义转换器,匹配任意expression式: 自定义转换器

     from random import randrange from werkzeug.routing import Rule, Map, BaseConverter, ValidationError class BooleanConverter(BaseConverter): def __init__(self, url_map, randomify=False): super(BooleanConverter, self).__init__(url_map) self.randomify = randomify self.regex = '(?:yes|no|maybe)' def to_python(self, value): if value == 'maybe': if self.randomify: return not randrange(2) raise ValidationError() return value == 'yes' def to_url(self, value): return value and 'yes' or 'no' url_map = Map([ Rule('/vote/<bool:werkzeug_rocks>', endpoint='vote'), Rule('/vote/<bool(randomify=True):foo>', endpoint='foo') ], converters={'bool': BooleanConverter}) 

    你也可以写一个捕获所有types的路线,并在方法中做复杂的路由:

     from flask import Flask app = Flask(__name__) @app.route('/', methods=['GET', 'POST'], defaults={'path': ''}) @app.route('/<path:path>', methods=['GET', 'POST']) def catch_all(path): return 'You want path: %s' % path if __name__ == '__main__': app.run() 

    这将匹配任何请求。 在这里看到更多的细节: Catch-All URL 。