六:flask-自定义URL转换器
flask进行url参数匹配的时候,是继承的werkzeug.routing.BaseConverter库进行重写的
导入看源码
里面有所有的URL参数数据类型的判断
也就是说,可以继承过后实现自己的需求,即自定义url转换器比如:
url中,接收一个参数,限制此参数必须满足手机号格式
from flask import Flask
from werkzeug.routing import BaseConverter app = Flask(__name__) class PhoneConveter(BaseConverter):
""" 校验手机号 """
# BaseConverter下是使用regex来指定规则
regex = r'1[85734]\d{9}' # 第一位为1,第二位为85734之一,\d为数字,{9}指9位 app.url_map.converters['phone'] = PhoneConveter # 把自定义的规则加到url匹配规则中 # 接收一个参数,限制此参数必须满足手机号格式
@app.route('/phone/<phone:phone_num>/')
def phone(phone_num):
return f'接收到的手机号码为:{phone_num}'
to_python()方法,此方法的返回值,会自动传给使用到当前url转换规则的视图函数
如:在接口后面加参数a+b,则返回a的资源和b的资源
正常情况下应该是把接收到的参数根据 “+” 号进行切片,然后分别获取对应数据再返回,但是这个方法需要每个视图函数里面都要进行一次切片,如果这样的url参数非常多的话,就很麻烦
如果使用自定义url转换器的话,可以直接接收到就参数就转换成list传给视图函数处理,在BaseConverter下有个 to_python()方法,此方法的返回值,会自动传给使用到当前url转换规则的视图函数
class ListConveter(BaseConverter):
def to_python(self, value):
return value.split('+') app.url_map.converters['list'] = ListConveter # 把自定义的规则加到url匹配规则中 # 在接口后面加参数a+b,则返回a的资源和b的资源
@app.route('/posts/<list:boards>/')
def posts_(boards):
return f'资源a:{boards[0]}, 资源b:{boards[1]}'
to_url()方法,正好和to_python()方法相反,是在url_for()构建url的时候,将参数处理后再组成url
如,在构建url的时候,传入一个list,构建后的url为:url/list[0]+list[1]
class ListConveter(BaseConverter):
def to_python(self, value):
return value.split('+') def to_url(self, value):
print(f'value: {value}')
return '+'.join(value) app.url_map.converters['list'] = ListConveter # 把自定义的规则加到url匹配规则中 @app.route('/')
def hello_world():
a = url_for('posts_', boards=['a', 'b'])
print(f'a: {a}')
return a # 在接口后面加参数a+b,则返回a的资源和b的资源
@app.route('/posts/<list:boards>/')
def posts_(boards):
return f'资源a:{boards[0]}, 资源b:{boards[1]}'
六:flask-自定义URL转换器的更多相关文章
- flask 自定义url转换器
from werkzeug.routing import BaseConverter app = Flask(__name__) class TeleConveter(BaseConverter): ...
- flask第十一篇——自定义url转换器
首先和大家说一下flask的组成,flask其实是werkzeug(路由和http处理)+SQLAlchemy(数据库)+Jinja2(模板)组成的,今天我们要看到的东西就是`werkzeug`里面的 ...
- python_flask 基础巩固(自定义URL转换器)
自定义URL转换器(在BaseConverter类外定义)from werkzeug.routing import BaseConverter定义类继承BaseConverter 实现类app.url ...
- django 自定义url转换器
django内置的url转换器,包括有int.str.uuid等等.但是有时候他们不能满足我们的需求,因此就需要使用自定义url转换器.自定义url转换器的五步:1.定义一个类,直接继承自object ...
- python3 Flask -day4 自定义url转换器
url传参可以限定参数的数据类型,例如:限定user_id数据类型为int @app.route('/user/<int:user_id>') def my_list(user_id): ...
- flask第十二篇——自定义url转换器【2】
继续昨天的话题,今天我们来写一个手机号的转换器,方便大家理解 我们在`BaseConverter`源码里看到好多这种正则表达式: 正则表达式的目的就是规范匹配的规则,现在我们写一个简单的匹配手机号的正 ...
- 4、Flask实战第4天:自定义url转换器
url传参可以限定参数的数据类型,例如:限定user_id数据类型为int @app.route('/user/<int:user_id>') def my_list(user_id): ...
- 自制URL转换器
自定义 url 转换器五个步骤: 定义一个类. 在类中定义一个属性 regex ,这个属性是用来保存 url 转换器规则的正则表达式. 实现 to_python(self,value) 方法, ...
- flask动态url规则
动态URL规则 URL规则可以添加变量部分,也就是件更符合同规则的URL抽象成一个URL模式. @app.route('/item/<id>') def item(id): return ...
随机推荐
- python cv2展示网络图片、图片编解码、及与base64转换
从网络读取图像数据并展示 需要使用cv2.imdecode()函数,从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式:主要用于从网络传输数据中恢复出图像. # -*- coding: utf ...
- IMAPd - Internet 邮件存取协议服务器
总览 /usr/etc/imapd 描述 imapd 是个支持 IMAP4rev1 远程邮件存取协议(由RFC2060定义)的服务器. imapd 是由internet服务器(参见 inetd(8)) ...
- 关于ARM PC值
PC值(Program Counter). ARM采用流水线来提高CPU的利用效率, 对于三级流水线, 一条汇编指令的执行包括 取值, 译码, 执行三个阶段. 当MOV指令的取指动作完毕后, 进入M ...
- Codeforces 899 1-N两非空集合最小差 末尾最多9对数计算 pair/链表加优先队列最少次数清空
A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define pb push_bac ...
- PCRE does not support \L, \l, \N{name}, \U, or \u...
PCRE does not support \L, \l, \N{name}, \U, or \u... 参考文章:YCSUNNYLIFE 的 <php 正则匹配中文> 一.报错情景: 使 ...
- 图形计算器(geogebra[5.0.278.0])使用QQ浏览器打开下载
点击这里下载Geogebra图形计算器
- mybatis 的 DefaultVFS 日志乱码问题
mybatis 的 DefaultVFS 日志乱码问题 mybatis DefaultVFS 乱码 1. 问题描述 今天在启动同事搭建的工程时,发现 console 中乱码,细看下,是 mybat ...
- LOJ-6280-数列分块入门4
链接: https://loj.ac/problem/6280 题意: 给出一个长为n 的数列,以及 n个操作,操作涉及区间加法,区间求和. 思路: sum维护区间和, tag维护每个区间多加的,不是 ...
- shell练习--PAT题目1004: 成绩排名 !(失败案例,shell运行超时)
读入 n(>)名学生的姓名.学号.成绩,分别输出成绩最高和成绩最低学生的姓名和学号. 输入格式: 每个测试输入包含 1 个测试用例,格式为 第 1 行:正整数 n 第 2 行:第 1 个学生的姓 ...
- python Tkinter 编程
Tkinter 是 Python 的标准 GUI 库.Python 使用 Tkinter 可以快速的创建 GUI 应用程序. 由于 Tkinter 是内置到 python 的安装包中.只要安装好 Py ...