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

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


皈依舞
浏览 115回答 2
2回答

当年话下

通过运行如下代码:from&nbsp;flask&nbsp;import&nbsp;Flaskfrom&nbsp;pprint&nbsp;import&nbsp;pprintif&nbsp;__name__&nbsp;==&nbsp;'__main__': &nbsp;&nbsp;&nbsp;&nbsp;app&nbsp;=&nbsp;Flask(__name__) &nbsp;&nbsp;&nbsp;&nbsp;pprint(app.url_map.converters)可以获取Flask默认支持的转换器:{'any':&nbsp;<class&nbsp;'werkzeug.routing.AnyConverter'>,&nbsp;'default':&nbsp;<class&nbsp;'werkzeug.routing.UnicodeConverter'>,&nbsp;'float':&nbsp;<class&nbsp;'werkzeug.routing.FloatConverter'>,&nbsp;'int':&nbsp;<class&nbsp;'werkzeug.routing.IntegerConverter'>,&nbsp;'path':&nbsp;<class&nbsp;'werkzeug.routing.PathConverter'>,&nbsp;'string':&nbsp;<class&nbsp;'werkzeug.routing.UnicodeConverter'>}那如何创建一个新的路由解析转化器呢?在Flask的app.py里有个简单的例子,这个例子是创建了一个list类型的路由转换器:from&nbsp;werkzeug.routing&nbsp;import&nbsp;BaseConverter&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class&nbsp;ListConverter(BaseConverter):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;to_python(self,&nbsp;value):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;value.split(',')&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;to_url(self,&nbsp;values):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;','.join(BaseConverter.to_url(value)&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;value&nbsp;in&nbsp;values)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; app&nbsp;=&nbsp;Flask(__name__)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;app.url_map.converters['list']&nbsp;=&nbsp;ListConverter那么我们可以容易创建一个正则解析器,因为之前的转换器最终也是转换成正则的,只需要将获取的值设置为regex属性就可以使用了:from&nbsp;flask&nbsp;import&nbsp;Flaskfrom&nbsp;werkzeug.routing&nbsp;import&nbsp;BaseConverterclass&nbsp;RegexConverter(BaseConverter):&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;map,&nbsp;*args): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.map&nbsp;=&nbsp;map &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.regex&nbsp;=&nbsp;args[0] app&nbsp;=&nbsp;Flask(__name__) app.url_map.converters['regex']&nbsp;=&nbsp;RegexConverter@app.route('/view/<regex("[a-zA-Z0-9]+"):uuid>/')def&nbsp;view(uuid):&nbsp;&nbsp;&nbsp;&nbsp;""" &nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;/view/1010000000125259/ &nbsp;&nbsp;&nbsp;&nbsp;result:&nbsp;view&nbsp;uuid:1010000000125259 &nbsp;&nbsp;&nbsp;&nbsp;""" &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"view&nbsp;uuid:&nbsp;%s"&nbsp;%&nbsp;(uuid)@app.route('/<regex(".*"):url>')def&nbsp;not_found(url):&nbsp;&nbsp;&nbsp;&nbsp;""" &nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;/hello &nbsp;&nbsp;&nbsp;&nbsp;result:&nbsp;not&nbsp;found:&nbsp;'hello' &nbsp;&nbsp;&nbsp;&nbsp;""" &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;"not&nbsp;found:&nbsp;'%s'"&nbsp;%&nbsp;(url)

犯罪嫌疑人X

插一句,flask也可以集中到一起。python的装饰器其实就是返回函数的函数,外层函数的参数就是装饰器的参数,内层函数的参数是被装饰的函数。所以直接调用app.route应该会返回一个函数,直接把req handler传进去就可以注册它。于是,你可以这样写:app.route(pattern)(handler)就能集中到一起了。
打开App,查看更多内容
随时随地看视频慕课网APP