您好,匿名用户
随意问技术百科期待您的加入

让Flask的路由URL支持正则

0 投票

flask跟web.py差别挺大的,尤其是在路由管理这块。web.py把所有的路由都集中在一起,我比较喜欢这种方式。最近用flask,发现@app.route('<URL>')中URL只支持string、int、float、path 4种类型,并不支持正则。

但我觉得flask绝对没有这么低级,肯定有支持的方法,所以来向各路长老求个方子

用户头像 提问 2012年 12月1日 @ Pantheon 上等兵 (388 威望)
分享到:

1个回答

0 投票
 
最佳答案

通过运行如下代码:

from flask import Flask
from pprint import pprint

if __name__ == '__main__':
    app = Flask(__name__)
    pprint(app.url_map.converters)

可以获取Flask默认支持的转换器:

{'any': <class 'werkzeug.routing.AnyConverter'>,
 'default': <class 'werkzeug.routing.UnicodeConverter'>,
 'float': <class 'werkzeug.routing.FloatConverter'>,
 'int': <class 'werkzeug.routing.IntegerConverter'>,
 'path': <class 'werkzeug.routing.PathConverter'>,
 'string': <class 'werkzeug.routing.UnicodeConverter'>}

那如何创建一个新的路由解析转化器呢?
在Flask的app.py里有个简单的例子,这个例子是创建了一个list类型的路由转换器:

from werkzeug.routing import BaseConverter           
                                                     
class ListConverter(BaseConverter):                  
    def to_python(self, value):                      
        return value.split(',')                      
    def to_url(self, values):                        
        return ','.join(BaseConverter.to_url(value)  
                        for value in values)         
                                                     
app = Flask(__name__)                                
app.url_map.converters['list'] = ListConverter

那么我们可以容易创建一个正则解析器,因为之前的转换器最终也是转换成正则的,只需要将获取的值设置为regex属性就可以使用了:

from flask import Flask
from werkzeug.routing import BaseConverter
class RegexConverter(BaseConverter):
    def __init__(self, map, *args):
        self.map = map
        self.regex = args[0]

app = Flask(__name__)
app.url_map.converters['regex'] = RegexConverter

@app.route('/view/<regex("[a-zA-Z0-9]+"):uuid>/')
def view(uuid):
    """
    url: /view/1010000000125259/
    result: view uuid:1010000000125259
    """
    return "view uuid: %s" % (uuid)

@app.route('/<regex(".*"):url>')
def not_found(url):
    """
    url: /hello
    result: not found: 'hello'
    """
    return "not found: '%s'" % (url)

if __name__ == '__main__':
    app.run()
用户头像 回复 2012年 12月1日 @ Wukong 上等兵 (475 威望)
选中 2012年 12月1日 @Pantheon
提一个问题:

相关问题

0 投票
1 回复 32 阅读
0 投票
1 回复 74 阅读
0 投票
1 回复 49 阅读
0 投票
1 回复 29 阅读
用户头像 提问 2014年 2月23日 @ Gragas 上等兵 (254 威望)
+1 投票
1 回复 89 阅读
用户头像 提问 2013年 1月24日 @ mongodb 上等兵 (152 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...