A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 杰哥,我就服你 于 2018-8-30 13:42 编辑

自定义转换器
转换器的作用:是对url地址的限制
自定义转换器的语法:<converter:variable_name>
自定义转换器的步骤:
1. 自定义转换器必须继承BaseConverter类,自定义转换器需要重写父类的init方法,重点是注意参数。
2. 在调用时,《re(“.“):file_name》,会把 . 作为参数传给*args,再传给父类的regex作为正则,匹配url,匹配上的内容作为参数file_name传给视图函数。
3. 自定义转换器需要注册,re是转换器调用的是key

关于其中的 to_python 方法
首先是实现一个简单的路由转换器去匹配三位数字,代码如下:

在这个基础上,我们要对 BaseConverter 里面的三个方法进行重写:

在查看了源码之后,我们发现 NumberConverter 是可以实现匹配任意长度的数字的。
NumberConverter 是 IntegerConverter 的父类 。在 NumberConverter 的 to_python 方法里面完成了对字符串转换为 数字的装换过程 。

在进行视图函数之前,会首先进入到 转换器的 to_python 里面。在正则匹配之后,视图函数调用之前,会进入 to_python 方便下一步的处理。第一次匹配的结果,如果我们想做进一步的处理,就可以写在 to_python 这个函数里面 方便对其进行下一步的处理。
通过断点调试,我们发现我们转出的不是一个 int 类型,而是一个py2 字符串类型。


所以进一步的改进方案就是重写 to_python 方法,添加:
返回值就是我们做正则匹配的值。

这时候:

我们不一定要重写 to_python, 看我们的实际需要 ……

关于其中的 to_url 方法
如果有时候我们得不到预期的结果,我们可以尝试清理一下 cookie 缓存 …
我们回到一个简单的模型,如下:


通过断点调试我们发现我们的系统只进入了 to_python 而没有进入 to_url 。这是因为 to_url 是 flask 重定向的时候使用的。
to_url 是在开始匹配之前就调用,将收集到的 order_id 传进去 ,第一次进行处理 ,比如在 BaseConverter 里面就进行了 基本的字符串编码。也是为了方便 to_python 的处理。它跟匹配成功与否并没有关系。我们查看源码发现,发现 NumberConverter 的to_url 对位数进行了处理 ,不满指定的位数补上 0 。
简言之, 在开始匹配之后,匹配成功之前,对匹配出来的 order_id 做第一步的处理,是为了保证可以顺利进入 to_python 里面。无论在最终的重定向时最终的成功与否,都会被调用,打前战…目的是为了让 value 无限匹配 regex

使用自带的 int 转换器


最终版本


(8)正则路由示例
在web开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要正则匹配。限制访问,优化访问。
导入转换器包


自定义转换器并实现
自定义转换器

自带几种转换器



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马