Flask中的URL部分什么方法可以让它支持正则,FlaskURL方法,flask跟web.py
Flask中的URL部分什么方法可以让它支持正则,FlaskURL方法,flask跟web.py
flask跟web.py差别挺大的,尤其是在路由管理这块。web.py把所有的路由都集中在一起,我比较喜欢这种方式。最近用flask,发现@app.route('<URL>')中URL只支持string、int、float、path 4种类型,并不支持正则。
但我觉得flask绝对没有这么低级,肯定有支持的方法,所以来向各路长老求个方子
通过运行如下代码:
from flask import Flaskfrom pprint import pprintif __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 Flaskfrom werkzeug.routing import BaseConverterclass 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()
插一句,flask也可以集中到一起。
python的装饰器其实就是返回函数的函数,外层函数的参数就是装饰器的参数,内层函数的参数是被装饰的函数。所以直接调用app.route应该会返回一个函数,直接把req handler传进去就可以注册它。
于是,你可以这样写:
app.route(pattern)(handler)
就能集中到一起了。
赞同 @cute 的答案,再进一步:self.regex到底是什么?
Flask(其实是Werkzeug)使用Converter把URL中特殊部分(<regex("[a-zA-Z0-9]+"):uuid>)转换为Python变量,通用格式是<converter(args):var_name>。在这个例子中,一个叫regex的converter把URL中相应字段转换为view()中的uuid变量。
因此,converter的regex就是用来判断这串字符是否符合转换格式,ok就转换,否则跳过。对于IntegerConverter来说,"abc"显然无能为力。也就是说,其实Werkzeug的路由本来就支持用正则表达式。string、int、float等都是从它派生出来的(可以看看IntegerConverter等built-in Converter的regex)。
至于为什么不显式地支持,我猜可能是因为正则表达式不容易写好,buggy。
编橙之家文章,
相关内容
- Python这种修改了传入对象的函数, 是否应该用deepcopy, 另
- Python web开发难不难需要了解哪些知道点,python难不难
- Python .pyc文件如何从源码文件夹中剥离出来,,比如,我
- Python求两个数之间所有的素数求思路,python素数,题目要
- Python XML禁止转义设置方式是怎样的,python转义,使用P
- Python数据分析暂存大数据存放问题,python数据分析,表中
- Python中文编码,只针对url内部中文编码处理问题,,已经
- scrapy python xpath相关问题,scrapyxpath,Response.bod
- 求Python剥离Django中db, orm模块的方法,djangoorm,SQLAlchemy太
- python捉虫想得到onclick的链接要怎么写?,python捉虫,&
评论关闭