作用和基本使用

作用:

用于校验请求的路由参数中的值是否符合符合指定的规则。

这个使用方法和django中的路由参数转换器是差不多的。

至于为什么用路径参数转换器,原因和django中的一样,虽然你可以在视图函数中校验,但是如果有好几个视图函数都要用到相同的校验规则,此时使用路径参数转换器就很好的体现了面向对象的封装思想。

基本语法:<转换器名称:路径参数名>

基本使用实例:


@app.route('/users/<int:user_id>')
# 路由参数中写的是user_id,视图函数中就必须要有这个参数接收
def user_info(user_id):
print(type(user_id))
return f"{user_id=}" # 或者直接将视图函数的参数定义成*args, **kwargs,然后再获取
@app.route('/users/<int:user_id>')
def user_info(*args, **kwargs):
user_id = kwargs.get("user_id")
print(type(user_id))
return f"{user_id=}"

flask中自带的转换器,分别为:

#: the default converter mapping for the map.
DEFAULT_CONVERTERS: t.Mapping[str, type[BaseConverter]] = {
"default": UnicodeConverter,
"string": UnicodeConverter,
"any": AnyConverter,
"path": PathConverter,
"int": IntegerConverter,
"float": FloatConverter,
"uuid": UUIDConverter,
}

自定义转换器

自带的路径参数转换器很多时候都无法完全满足我们的需求,比如我们要校验手机号...又是手机号,没错..

步骤与django大同小异,都是先编写转换器类,然后注册使用。

第一步:编写继承BaseConverter的转换器类,并编写正则。

(和django不一样的是,django不需要继承某个类)

from werkzeug.routing import BaseConverter

class MobileConverter(BaseConverter):

    # 编写正则表达式
# 注意:不能写^来匹配开头,但是可以用$匹配结尾。这和django的转换器也是一样的。
regex = r"1[3-9]\d{9}$" def __init__(self, map, *args, **kwargs):
# 重写init方法可以做一些更多的功能,比如int转化器,可以这样用<int(max=199):age>
# 这种方式就是在init中初始化的,具体直接看NumberConverter
super().__init__(map, *args, **kwargs) # 这里可以根据需要决定是否重写to_python方法
# 然后可以实现更多的功能,具体也可以参考NumberConverter
# if self.fixed_digits and len(value) != self.fixed_digits:
# raise ValidationError()
# value = self.num_convert(value)
# if (self.min is not None and value < self.min) or (
# self.max is not None and value > self.max
# ):
# raise ValidationError()
# return value
def to_python(self, value: str):
# 父类默认是直接返回value
return super().to_python(value)

django转换器:

class PhoneNumberConverter:
regex = r'1[3-9]\d{9}' # to_python的作用是返回给视图
def to_python(self, value):
return str(value) # to_urls是一个反向解析用的(了解即可,不实现也可以)
# def to_url(self, value):
# return str(value)

第二步:注册转换器

flask中:

# 注册自定义转换器,需要先注册才能在路由中使用。
# mobile就是在url路径参数中使用的名称
app.url_map.converters["mobile"] = MobileConverter

django中:

# 注册转换器,需要在urlpatterns前面注册,因为你要先注册才能用呀

# 先导入注册函数
from django.urls.converters import register_converter # register_converter(转换器类, 在路由urls中使用的名称)
register_converter(PhoneNumberConverter, "phonecheck")

URL路径参数转换器的更多相关文章

  1. Vue Router 获取url路径参数 query

    https://router.vuejs.org/zh/api/#路由对象属性 $route.query 类型: Object 一个 key/value 对象,表示 URL 查询参数.例如,对于路径  ...

  2. 获取URL路径参数getUrlParams

    function getUrlParams(){ var reg = new RegExp("(^|&)" + name + "=([^&]*)(& ...

  3. JS分页 + 获取MVC地址栏URL路径的最后参数

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  4. 将map中的查询参数拼装到URL路径中

    被调接口的URL路径: //被调接口url String apiUrl = "http://api.open.xxxxxx.com/implatform/interview/send?acc ...

  5. CSS样式表、JS脚本加载顺序与SpringMVC在URL路径中传参数与SpringMVC 拦截器

    CSS样式表和JS脚本加载顺序 Css样式表文件要在<head>中先加载,这样网页显示时可以第一次就渲染出正确的布局和样式,网页就不会闪烁,或跳变 JS脚本尽可能放在<body> ...

  6. SpringMvc路径参数和url的两种实现方式

    我们经常采用的SpringMvc路径参数经常的操作是在url后面采用?参数名=值1&参数名2=值2这种方式实现 RequestMapping的作用: 1)当作用在controller时,我们通 ...

  7. 【API管理 APIM】APIM中如何配置使用URL路径的方式传递参数(如由test.htm?name=xxx 变为test\xxx)

    问题描述 在默认的URL传递参数中,我们使用的是https://test01.azure-api.cn/echo/resource?param1=sample&param2=testname这 ...

  8. FastAPI(4)- get 请求 - 路径参数 Path Parameters

    什么是路径 假设一个 url 是: http://127.0.0.1:8080/items/abcd 那么路径 path 就是 /items/abcd 路径参数 就是将路径上的某一部分变成参数,可通过 ...

  9. JS-获取URL请求参数

    前言:原来做过一个项目,需要实现一个页面打印的功能,由于项目中使用了AngularJS+Bootstrap等前端框架,需要打印的页面又在弹出框中,使用了Bootstrap的模态框后发现打印的效果不太好 ...

  10. java 截取url的参数

    /** * 去掉url中的路径,留下请求参数部分 * @param strURL url地址 * @return url请求参数部分 * @author lzf */ private static S ...

随机推荐

  1. Codeforces Round 882 div.2 B

    Smiling & Weeping ----玫瑰花你拿才好看,风景要和你看才浪漫--<-<-<@ B. Hamon Odyssey time limit per test 1 ...

  2. 问题总结:浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断

    浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用equals来判断. 说明:浮点数采用"尾数+阶码"的编码方式,类似于科学计数法的"有效数字+指数& ...

  3. ​python爬虫——爬取天气预报信息

    在本文中,我们将学习如何使用代理IP爬取天气预报信息.我们将使用 Python 编写程序,并使用 requests 和 BeautifulSoup 库来获取和解析 HTML.此外,我们还将使用代理服务 ...

  4. Angular2 通过自定义指令限制输入框输入类型

    ** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/16814577.html 在input控件中,使用type="n ...

  5. Noi-Linux 2.0 装机+使用整合

    写在前面 网上的东西比较多,也比较杂乱,不是很方便,所以我整合了一些关于 Noi-Linux2.0 虚拟机装机方法+代码编辑环境+实地编程的介绍,看完至少能用起来打代码了. NOI 官网公告(JS 开 ...

  6. Hyper-V 下的 Debian 双网卡配置

    Debian 双网卡配置 因为 Hyper-v 不能在 Hyper-v Manger 里设置网卡的静态 IP, 而每次开机自启之后又要连接 Debian 虚拟机,所以使用了双网卡. 双网卡分为内网网卡 ...

  7. 《最新出炉》系列初窥篇-Python+Playwright自动化测试-22-处理select下拉框-上篇

    1.简介 在实际自动化测试过程中,我们也避免不了会遇到下拉框选择的测试,因此宏哥在这里直接分享和介绍一下,希望小伙伴或者童鞋们在以后工作中遇到可以有所帮助.今天,我们讲下playwright的下拉框怎 ...

  8. 多线程指南:探究多线程在Node.js中的广泛应用

    前言 最初,JavaScript是用于设计执行简单的web任务的,比如表单验证.直到2009年,Node.js的创建者Ryan Dahl让开发人员认识到了通过JavaScript 进行后端开发已成为可 ...

  9. 二进制枚举&爆搜DFS

    给定一个如下图所示的全圆量角器. 初始时,量角器上的指针指向刻度 0. 现在,请你对指针进行 n 次拨动操作,每次操作给定一个拨动角度 ai,由你将指针拨动 ai 度,每次的拨动方向(顺时针或逆时针) ...

  10. 猜单词游戏(c++)

    #include<iostream> #include<string> #include<fstream> #include<cstdlib> #inc ...