热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flask(8)正则路由与自定义转换器

转换器的作用:是对url地址的限制自定义转换器的语法:自定义转换器的步骤:1.自定义转
  1. 转换器的作用:是对url地址的限制
  2. 自定义转换器的语法:

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

#coding:utf-8from flask import Flaskfrom werkzeug.routing import BaseConverterapp = Flask(__name__)class RegexConverter(BaseConverter):def __init__(self,url,*args):super(RegexConverter,self).__init__(url)self.regex = args[0]app.url_map.converters['re'] = RegexConverter@app.route('/send/')def send_sms(mobile):return 'send sms %s' %mobileif __name__ == '__main__':app.run(debug=True)

更新于 2018.8.3

关于其中的 to_python 方法

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

# coding:utf-8
from flask import Flask
from werkzeug.routing import BaseConverterclass RegexConverter(BaseConverter):regex = r'[0-9]{3}'app = Flask(__name__)app.url_map.converters['re'] = RegexConverter@app.route('/')
def hello_world():return 'Hello World!'@app.route('/order/')
def order(order_id):print(type(app.url_map))return 'order %s' % order_idif __name__ == '__main__':app.run(debug=True)

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

__init__ to_python to_url

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

在进行视图函数之前,会首先进入到 转换器的 to_python 里面。在正则匹配之后,视图函数调用之前,会进入 to_python 方便下一步的处理。第一次匹配的结果,如果我们想做进一步的处理,就可以写在 to_python 这个函数里面 方便对其进行下一步的处理。

通过断点调试,我们发现我们转出的不是一个 int 类型,而是一个py2 字符串类型。
这里写图片描述

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

def to_python(self, value):value = int(value)return value

这时候:
这里写图片描述

我们不一定要重写 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 转换器

# coding:utf-8
from flask import Flask, redirect, url_for
from werkzeug.routing import BaseConverterapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello World!'@app.route('/order/')
def order(order_id):return 'order %s' % order_id@app.route('/demo')
def demo():return redirect(url_for('order', order_id='123'))if __name__ == '__main__':app.run(debug=True)

最终版本

# -*- coding:utf-8 -*-from flask import Flask, redirect, url_for
from werkzeug.routing import BaseConverter# 需求:自定义路由转换器,实现order_id必须传入三位数
class RegexConverter(BaseConverter):"""自定义路由转换器,实现匹配三位数字"""# 重写构造方法,接受外界传入的参数,传入设么正则,就匹配设么样的结果def __init__(self, url_map, *args):super(RegexConverter, self).__init__(url_map)# 约定:默认第0个就是正则参数self.regex = args[0]# 在匹配成功之后,调用视图函数之前,将匹配的结果传入到value,做下一步的处理def to_python(self, value):value = int(value)return value# 在开始匹配之后,匹配成功之前,对匹配出来的order_id,做第一步的处理,用为了保证可以顺利的进入to_python# 无论在重定向时最终的匹配成功与否成功,都会被调用,打前站,目的就是为了让value无限匹配regex# 搭配重定向的url_for使用的def to_url(self, value):# 可以在这里做第一次匹配修正动作value = int(value)value = '%03d' % valuereturn valueapp = Flask(__name__)# 将自定义的路由转换器加入到转换器列表中
app.url_map.converters['re'] = RegexConverter# 需求:只有当order_id时数字时,才能进入到视图函数
# 需要使用正则严格匹配
# http://127.0.0.1:5000/order/1
@app.route('/order/')
def order(order_id):return 'order %s' % order_id# 访问demo,重定向到order,并传入参数
@app.route('/demo')
def demo():return redirect(url_for('order', order_id='12'))if __name__ == '__main__':app.run(debug=True)

更新于 2018.8.28

(8)正则路由示例

在web开发中,可能会出现限制用户访问规则的场景,那么这个时候就需要正则匹配。限制访问,优化访问。

导入转换器包

from werkzeug.routing import BaseConverter

自定义转换器并实现


自定义转换器

class Regex_url(BaseConverter):def __init__(self,url_map,*args):super(Regex_url,self).__init__(url_map)self.regex = args[0]app = Flask(__name__)
# 将自定义转换器类添加到转换器字典中
app.url_map.converters['re'] = Regex_url@app.route('/user/')
def hello_world(id):return 'hello %s' %id

自带几种转换器

DEFAULT_CONVERTERS = {'default': UnicodeConverter,'string': UnicodeConverter,'any': AnyConverter,'path': PathConverter,'int': IntegerConverter,'float': FloatConverter,'uuid': UUIDConverter,
}

联系方式

很少看评论
qq:2564493603
欢迎交流


推荐阅读
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文详细介绍了Python中正则表达式和re模块的使用方法。首先解释了转义符的作用,以及如何在字符串中包含特殊字符。然后介绍了re模块的功能和常用方法。通过学习本文,读者可以掌握正则表达式的基本概念和使用技巧,进一步提高Python编程能力。 ... [详细]
  • 本文介绍了在Java中检查字符串是否仅包含数字的方法,包括使用正则表达式的示例代码,并提供了测试案例进行验证。同时还解释了Java中的字符转义序列的使用。 ... [详细]
  • Ihaveaworkfolderdirectory.我有一个工作文件夹目录。holderDir.glob(*)>holder[ProjectOne, ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • 我将SpringMVC升级到Spring3.2.5.我的一些剩余调用即使存在,也会返回无法识别的字段异常.这是错误.Resolvingexceptionfrom ... [详细]
  • splitjava的简单介绍
    本文目录一览:1、Javasplit方法2、 ... [详细]
  • python中使用正则表达式的步骤:1.导入re模块:importre2.初始化一个Regex对象:re.compile()3.刚刚创建的 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了如何使用Python正则表达式匹配MATLAB的函数语法,包括多行匹配和跨行签名的处理方法。同时,作者还分享了自己遇到的问题和解决方案。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
author-avatar
我是小储哥
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有