知识点: 1、转换器 2、自定义转换器 3、转化器高级用法

一、概况

有很多请求我们URL地址后面会跟着参数,并且后端要提取到参数,比如:http://127.0.0.1:5000/center/1这个URL地址后面有个1,可以代表我们要访问uid为1的个人信息。那么我们如何提取到参数呢?这个时候就会用到Flask的转换器。

二、转换器

Flask中支持下面这些转换器:

转换器 含义
default 接受字符串,默认转换器
stirng 接受字符串,跟默认一样
int 接受整数
float 同 int ,但是接受浮点数
uuid 唯一识别码
path 和默认的相似,但也接受斜线
from flask import Flask
from flask import redirect, url_forapp = Flask(__name__)@app.route('/center/<int:uid>')  # 代表个人中心页
def center(uid):  # 视图函数return 'your uid %s' % uid  # 返回内容if __name__ == '__main__':# 0.0.0.0代表任何能代表这台机器的地址都可以访问app.run(host='0.0.0.0', port=5000)  # 运行程序复制代码

在浏览器访问:

如果改成:

@app.route('/center/<float:uid>')  # 代表个人中心页
复制代码

再去访问就会报错,因为float只支持浮点数。

如果不写转换器,那么它的默认转换器就是str类型。但是不包含/,因为它在这里面有特殊的意义。

@app.route('/center/<uid>')  # 代表个人中心页
复制代码

如果要匹配/,请用path转换器:

@app.route('/center/<path:uid>')  # 代表个人中心页
复制代码

三、自定义转换器

有时候系统提供的转换器并不能满足我们,比如我们需要的UID是至少5最多10位。如果不是这个范围呢,我们就可以认为不满足我们的匹配规则。而现在我们不管输入多少位,后台都会匹配上,然后就去执行我们的视图。如果要排除这种现象,我们就需要自定义转换器。

需要用到Flask这个转换器基类BaseConverter

from flask import Flask
from flask import redirect, url_for
from werkzeug.routing import BaseConverterapp = Flask(__name__)# 自定义转换器
class MyConverter(BaseConverter):def __init__(self, map):super().__init__(map)  # 调用父类self.regex = r'\d{5,10}'  # 转换器的正则规则app.url_map.converters['re'] = MyConverter  # 注册到converters#会根据注册的键re找到MyConverter这个类创建对象
@app.route('/center/<re:uid>')  # 代表个人中心页
def center(uid):  # 视图函数return 'your uid %s' % uid  # 返回内容if __name__ == '__main__':# 0.0.0.0代表任何能代表这台机器的地址都可以访问app.run(host='0.0.0.0', port=5000)  # 运行程序复制代码

这个在浏览器试下:

我们发现已经完全解决了我们刚才的问题。

四、优化转换器

我们发现这个转化器的规则是写死的,只能匹配UID,如果其他地方用到要匹配手机号怎么办,所以最好匹配规则是动态传递的。那么改成如下:

from flask import Flask
from flask import redirect, url_for
from werkzeug.routing import BaseConverterapp = Flask(__name__)# 自定义转换器
class MyConverter(BaseConverter):def __init__(self, map, re):super().__init__(map)  # 调用父类self.regex = re  # 转换器的正则规则app.url_map.converters['re'] = MyConverter  # 注册到converters#会根据注册的键re找到MyConverter这个类创建对象,并把规则当做初始化参数传递进去
@app.route('/center/<re(r"\d{5,10}"):uid>')  # 代表个人中心页
def center(uid):  # 视图函数return 'your uid %s' % uid  # 返回内容@app.route('/login/<re(r"1[3456789]\d{9}"):phone>')  # 代表登录页
def login(phone):  # 视图函数return 'your phone %s' % phone  # 返回内容if __name__ == '__main__':# 0.0.0.0代表任何能代表这台机器的地址都可以访问app.run(host='0.0.0.0', port=5000)  # 运行程序复制代码

用到的时候,在把具体的正则条件传递进去,就好了。

五、转换器高级用法

通过上面的一些场景我们用到了转换器,可是既然转换器,我们并没有看出转换这个两个字在哪有体现,感觉不如叫适配器。但是进入BaseConverter源码里面看一下,发现有两个方法,这两个方法是到底有什么作用呢,不妨我们来重写一下。

class BaseConverter(object):"""Base class for all converters."""regex = '[^/]+'weight = 100def __init__(self, map):self.map = mapdef to_python(self, value):return valuedef to_url(self, value):return url_quote(value, charset=self.map.charset)
复制代码
  • 重写to_python 我们在这个方法里面随便返回点内容
from flask import Flask
from flask import redirect, url_for
from werkzeug.routing import BaseConverterapp = Flask(__name__)# 自定义转换器
class MyConverter(BaseConverter):def __init__(self, map, re):super().__init__(map)  # 调用父类self.regex = re  # 转换器的正则规则def to_python(self, value):return '呵呵'  # 随便给一个返回值app.url_map.converters['re'] = MyConverter  # 注册到converters# 会根据注册的键re找到MyConverter这个类创建对象,并把规则当做初始化参数传递进去
@app.route('/center/<re(r"\d{5,10}"):uid>')  # 代表个人中心页
def center(uid):  # 视图函数return 'your uid %s' % uid  # 返回内容# 会根据注册的键re找到MyConverter这个类创建对象,并把规则当做初始化参数传递进去
@app.route('/login/<re(r"1[3456789]\d{9}"):phone>')  # 代表登录页
def login(phone):  # 视图函数return 'your phone %s' % phone  # 返回内容if __name__ == '__main__':# 0.0.0.0代表任何能代表这台机器的地址都可以访问app.run(host='0.0.0.0', port=5000)  # 运行程序复制代码

当我们请求的时候发现:

如果还继续返回value呢?

   def to_python(self, value):return value  # 返回value
复制代码

看到这我们应该明白了,父类里面默认返回的值就是正则匹配的值,如果重写了,传入进来的value还是正则匹配的值,但是return的值我们可以自己改变了。比如你传的是13888888888,那我就返回13999999999在这才有转换的体现。到底返回什么样的值,还是看具体场景。

  • 重写to_url 不知道还记得我们的重定向吗?我们可以通过重定向到任何视图中。如果我们现在希望登录函数重定向到个人中心视图怎么办?直接写函数名字,好像不对了,因为现在路由需要一个UID参数。我们需要像下面这么写,并且我们在to_url方法呢随便返回点内容:
from flask import Flask
from flask import redirect, url_for
from werkzeug.routing import BaseConverterapp = Flask(__name__)# 自定义转换器
class MyConverter(BaseConverter):def __init__(self, map, re):super().__init__(map)  # 调用父类self.regex = re  # 转换器的正则规则def to_python(self, value):return value  # 返回valuedef to_url(self, value):return '呵呵'  # 随便返回点内容app.url_map.converters['re'] = MyConverter  # 注册到converters# 会根据注册的键re找到MyConverter这个类创建对象,并把规则当做初始化参数传递进去
@app.route('/center/<re(r"\d{5,10}"):uid>')  # 代表个人中心页
def center(uid):  # 视图函数return 'your uid %s' % uid  # 返回内容# 会根据注册的键re找到MyConverter这个类创建对象,并把规则当做初始化参数传递进去
@app.route('/login/<re(r"1[3456789]\d{9}"):phone>')  # 代表登录页
def login(phone):  # 视图函数return redirect(url_for('center', uid='11111'))  # 重定向到个人中心页,uid是路由上的参数if __name__ == '__main__':# 0.0.0.0代表任何能代表这台机器的地址都可以访问app.run(host='0.0.0.0', port=5000)  # 运行程序复制代码

我们在浏览器试一下:http://127.0.0.1:5000/login/13812345678

注意浏览器center后面的UID变成了呵呵两个字。 如果还继续返回value呢?

    def to_url(self, value):return value  # 返回value
复制代码

我们在浏览器试一下:http://127.0.0.1:5000/login/13812345678

如果我们我们这改下代码:

    def to_python(self, value):return '12312'  def to_url(self, value):return value  # 返回value
复制代码

写到这,我们可以简单总结一下这两个函数什么时候执行

  • to_python 只要使了转换器,一直会被调用
  • to_url 只有在重定向了,并且路由上有参数的时候才会被调用

当我们重定向了,并传递参数的时候,参数会先到to_url,返回的值会去匹配路由上的正则。 如果匹配上了,就把匹配到参数传到 to_python ,这个方法返回的值才会到视图函数中。 如果匹配不上,就会报404错误。 流程如下:

欢迎关注我的公众号:

转载于:https://juejin.im/post/5cb989cef265da038364c109

Flask框架从入门到精通之转换器(四)相关推荐

  1. Flask框架从入门到精通之路由(三)

    知识点: 1.路由 2.重定向 3.请求方式 4.PostMan使用 一.概况 说到路由,其实就是我们在浏览器输入地址后,后台进行匹配,如果匹配上,则执行此视图函数并返回内容.我们经过前面的例子也看出 ...

  2. Flask框架从入门到精通之参数配置(二)

    知识点: 1.参数配置 一.概况 上一篇我们已经把Flask第一个程序运行起来了,那么这一篇主要讲一下Flask参数的配置. 二.配置参数 Flask参数配置方式有很多种,每一种都可以达到结果,在合适 ...

  3. Flask框架从入门到精通之模型创建与添加(十二)

    知识点: 1.模型类创建 2.模型类关系 3.模型数据添加 一.概况 在Flask-SQLAlchemy中,插入.修改.删除操作,均由数据库会话管理.会话用db.session表示.在准备把数据写入数 ...

  4. Flask框架基础入门教程

    文章目录 前言 Flask 基础概念和安装 Flask 快速入门小应用 Flask 之模板的使用 后续,待更新.... 前言 最近开始学习flask 框架,本文用于flask 框架的基础入门学习,版本 ...

  5. 后端开发——Flask框架从入门到入坟(终章)

    前言 前面已经将Flask框架的内容基本梳理完了,在这篇文章中荔枝会将Flask的部署上云的步骤跟大家分享一下,其实也是基于宝塔页面来进行配置的啦哈哈哈.荔枝也会将环境配置命令和数据库迁移步骤分享出来 ...

  6. [转]Flask --- 框架快速入门

    From:http://docs.jinkan.org/docs/flask/quickstart.html Flask 用户指南:http://docs.jinkan.org/docs/flask/ ...

  7. Flask --- 框架快速入门

    From:http://docs.jinkan.org/docs/flask/quickstart.html Flask 用户指南:http://docs.jinkan.org/docs/flask/ ...

  8. 后端开发——Flask框架从入门到入坟(中)

    前言 在上一篇文章中荔枝已经梳理了Flask的基础语法,但是想要靠这些东西来写一个项目是远远不够的噢,我们还需要一个更加清晰的项目逻辑来搭建一个Flask后端项目框架,在真实的项目开发中,我们还需要了 ...

  9. (转)Java任务调度框架Quartz入门教程指南(四)Quartz任务调度框架之触发器精讲SimpleTrigger和CronTrigger、最详细的Cron表达式范例...

    http://blog.csdn.net/zixiao217/article/details/53075009 Quartz的主要接口类是Schedule.Job.Trigger,而触发器Trigge ...

最新文章

  1. 终于找到了一篇文章!通俗地讲解面向对象的工作原理
  2. 提升网站在搜索引擎中的排名需要技巧性操作
  3. python点击屏幕_Python Appium 滑动、点击等
  4. python命令行参数作用_Python命令行参数解析模块argparse
  5. 楼宇自控ba系统 服务器,楼宇自控BA系统
  6. 双引擎驱动Quick BI十亿数据0.3秒分析,首屏展示时间缩短30%
  7. Windows平台下SVN安装配置及使用
  8. Android自定义抛出异常
  9. react native开发的新闻客户端
  10. Unity的NewInputSystem的InputManager实现多玩家的总结
  11. php过滤处理手机自带Emoji表情
  12. 矩阵运算_Eigen使用_基本数据类型
  13. java screenframe_一个关于JFrame的问题
  14. 计算机如何寻找ppt文件,如何快速找到电脑里的文件ppt课件
  15. 位列腾讯网易后面,三七互娱要页游“赚”云游戏?
  16. origin 双Y轴堆积条形图
  17. “信息系统灾难恢复方案设计”大赛
  18. B-Tree和LSM-Tree 优缺点对比
  19. AI Challenger 全球AI挑战赛[二]——场景分类比赛介绍(附数据集和基线模型百度云下载)
  20. mysql的flush privileges指令执行必要性问题

热门文章

  1. IEEE史上首位华人主席!马里兰大学终身教授刘国瑞当选
  2. CVPR 2020丨动态卷积:自适应调整卷积参数,显著提升模型表达能力
  3. SAP MM采购定价过程的一个简单例子
  4. SAP QM 含有HUM的检验批做UD时候的不同之处?
  5. 重新标注128万张ImageNet图片:多标签,提升模型性能
  6. AI超算“攒机”时代到来:为降低算力成本,这家公司牵头开放硬件标准
  7. 演讲实录丨周斌:人工智能推动新基建和数据中心的技术革新
  8. 机器学习系列22:异常检测
  9. 目前最实用的机器学习算法,你认为是哪几种?
  10. SAP EWM - 存储类型 - 入库控制