精选文章 flask路由规则及正则转换器converter

flask路由规则及正则转换器converter

作者:欧晨 时间: 2019-11-05 10:35:41
欧晨 2019-11-05 10:35:41

(1)查看所有路由

         我们可以通过app.url_map来查看当前项目下的所有 路由信息列表。

# coding:utf-8                                                              
                                                                             
from flask import Flask                                                     
                                                                            
# 创建flask应用                                                             
app = Flask(__name__)                                                       
                                                                             
@app.route('/')                                                             
def index():                                                                
    return 'hello Flask'                                                    
                                                                            
if __name__ == '__main__':                                                  
    # 通过url_map可以查看整个flask中的路由信息                              
    print(app.url_map)                                                      
    # 启动flask程序                                                         
    app.run() 

flask路由规则及正则转换器converter1

信息说明:

Map([ index>,
      ' (HEAD, OPTIONS, GET) -> static>
   ])


我们可以看到目前有两个路由
第一个:是 /,即我们定义的跟路由,后面是他支持的请求方式(HEAD, OPTIONS, GET)对应视图函数为index。
第二个:是/static/filename,这是系统自定义的静态文件访问路由,支持的请求方式有(HEAD, OPTIONS, GET),对应static文件夹

(2)自定义请求方式POST

@app.route('/post', methods=['POST'])


 

# coding:utf-8                                                              
                                                                             
from flask import Flask                                                     
                                                                            
# 创建flask应用                                                             
app = Flask(__name__, static_url_path='/python')                                                       
                                                                             
@app.route('/')                                                             
def index():                                                                
    return 'hello Flask'                                                    

@app.route('/post', methods=['POST'])
def post_request():
    return 'post method'
                                                                           
if __name__ == '__main__':                                                  
    # 通过url_map可以查看整个flask中的路由信息                              
    print(app.url_map)                                                      
    # 启动flask程序                                                         
    app.run() 

flask路由规则及正则转换器converter2

可以看到我们增加了一个POST请求后,在路由列表中打印了出来,请求路由为/post,请求方式(POST, OPTIONS)对应视图函数为post_request,同时我们修改了静态文件访问前缀为python,在路由列表中也体现了出来,但其实际文件存放路径依然为static目录。

(3)验证我们定义的请求方式是生效

flask路由规则及正则转换器converter3

flask路由规则及正则转换器converter4
我们发现,当我们在浏览器中访问:127.0.0.1:5000/post,回车后提示我们请求方式不允许,因为直接通过浏览器请求,请求方式为GET,所以会被拒绝。当我们通过终端使用curl -X POST -i命令以POST请求方式访问该路由时,返回了post method信息,说明我们定义的POST请求方式没有问题。

(4)同一路由装饰多个视图函数

@app.route('/hello', methods=['GET'])
def hello():
    return 'hello 1'

@app.route('/hello', methods=['POST'])
def hello2():
    return 'hello 2'


说明:如果两个视图请求路径一致,且请求方式也一致,那么上面的视图将会把下面的视图覆盖。

(5)同一视图多个路由装饰器

@app.route('/hi')
@app.route('/hi2')
def hi():
    return 'hi flask'



(6)反向解析

使用redirect函数,找到要跳转视图的url路由,进行跳转。

from flask import Flask, redirect                                                     
                                                                            
# 创建flask应用                                                             
app = Flask(__name__)                                                       
                                                                             
@app.route('/')                                                             
def index():                                                                
    return 'hello Flask' 

@app.route('/login')
def login():
    url = '/'
    return redirect(url)


使用url_for,找到要跳转视图的视图函数,进行跳转(推荐使用)。

from flask import Flask, url_for                                                     
                                                                            
# 创建flask应用                                                             
app = Flask(__name__)                                                       
                                                                             
@app.route('/')                                                             
def index():                                                                
    return 'hello Flask' 

@app.route('/login')
def login():
    url = url_for('index')
    return redirect(url)


(7)提取路由参数

@app.route('/goods/')
def goods_detail(id):
    return 'goods id is %d' % id


 

转化器     
int接收整形
float同int,但是可以接受浮点型
path和默认的相似,但也接受斜线

 

@app.route('/goods/')
def goods_detail(id):
    return 'goods id is %d' % id


不加转换器,默认是普通字符串规则(除了/的字符)

(8)定义自己的转换器

(1)定义装换器

from werkzeug.routing import BaseConverter
 
class MobelConverter(BaseConverter):
    """"""
    def __init__(self, url_map):
        # 调用父类的初始化方法
		super().__init__(url_map)
        # 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配
        self.regex = r'1[34578]\d{9}'


(2)将自定义转换器添加到flask应用中

app.url_map.converters['mobile'] = MobelConverter



(3)在url中使用

@app.route('/send/')
def send_msg(mobile):
    return 'send msg to %s' % mobile



(9)实现自己的万能转换器

(1)定义装换器

from werkzeug.routing import BaseConverter
 
class RegexConverter(BaseConverter):
    """"""
    def __init__(self, url_map, regex):
        # 调用父类的初始化方法
		super().__init__(url_map)
        # 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配
        self.regex = regex


(2)将自定义转换器添加到flask应用中

app.url_map.converters['re'] = RegexConverter



(3)在url中使用

@app.route("/send/")
def send_msg(mobile):
    return 'send msg to %s' % mobile



(10)BaseConverter对象解析

from werkzeug.routing import BaseConverter
from flask import Flask                                                 
                                                                            
# 创建flask应用                                                             
app = Flask(__name__) 

class RegexConverter(BaseConverter):
    """"""
    def __init__(self, url_map, regex):
        # 调用父类的初始化方法(python2中super()必须写参数)
        super(RegexConverter, self).__init__(url_map)
        # 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配
        self.regex = regex

        def to_python(self, value):
            print('to_python方法被调用 ')
            return value

        def to_url(self, value):
            pass

app.url_map.converters['re'] = RegexConverter

# 127.0.0.1:5000/send/18612345678
@app.route("/send/")
def send_msg(mobile):
    return 'send msg to %s' % mobile

if __name__ == '__main__':                                                                                                       
    # 启动flask程序                                                         
    app.run() 

flask路由规则及正则转换器converter5
to_python函数说明:
当我们访问路径127.0.0.1:5000/send/18612345678时,re(r'1[34578]\d{9}')匹配到的参数会先传递给函数to_python中的value参数,那么我们可以在to_python函数中对拿到的数据进行进一步处理,例如:类型转换,过滤等操作。

from werkzeug.routing import BaseConverter
from flask import Flask                                                 
                                                                            
# 创建flask应用                                                             
app = Flask(__name__) 

class RegexConverter(BaseConverter):
    """自定义转换器"""
    def __init__(self, url_map, regex):
        # 调用父类的初始化方法(python2中super()必须写参数)
        super(RegexConverter, self).__init__(url_map)
        # 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配
        self.regex = regex

        def to_python(self, value):
            """使用自定义转换器时会被调用"""
            value = 'abcdefg'
            return value

        def to_url(self, value):
            pass

app.url_map.converters['re'] = RegexConverter

# 127.0.0.1:5000/send/18612345678
@app.route("/send/")
def send_msg(mobile):
    return 'send msg to %s' % mobile

if __name__ == '__main__':                                                                                                       
    # 启动flask程序                                                         
    app.run() 


flask路由规则及正则转换器converter6
to_value函数说明:
该函数主要用于url_for反向解析

from werkzeug.routing import BaseConverter
from flask import Flask, redirect, url_for                                                 
                                                                            
# 创建flask应用                                                             
app = Flask(__name__) 

class RegexConverter(BaseConverter):
    def __init__(self, url_map, regex):
        # 调用父类的初始化方法(python2中super()必须写参数)
        super(RegexConverter, self).__init__(url_map)
        # 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配
        self.regex = regex

        def to_python(self, value):
            """使用自定义转换器时会被调用"""
            return value

        def to_url(self, value):
            """使用url_for时会被调用"""
            return value

app.url_map.converters['re'] = RegexConverter

# 127.0.0.1:5000/send/18612345678
@app.route("/send/")
def send_msg(mobile):
    return 'send msg to %s' % mobile

@app.route('/login')
def login():
    # /send/13673483485
    url = url_for('send_msg', mobile='13673483485')
    return redirect(url)

if __name__ == '__main__':                                                                                                       
    # 启动flask程序                                                         
    app.run() 


说明: 当用户访问127.0.0.1::5000/login时,会重定向到send_msg视图对应的url,而该路由需要接参数(手机号码),那么我们在进行反向解析时就需要传递该参数,而我们传递的参数首先会被传递给to_url函数中的value参数。

flask路由规则及正则转换器converter7

flask路由规则及正则转换器converter8

from werkzeug.routing import BaseConverter
from flask import Flask, redirect, url_for                                                 
                                                                            
# 创建flask应用                                                             
app = Flask(__name__) 

class RegexConverter(BaseConverter):
    def __init__(self, url_map, regex):
        # 调用父类的初始化方法(python2中super()必须写参数)
        super(RegexConverter, self).__init__(url_map)
        # 将正则表达式的参数保存到对象属性中,flask会去使用这个属性来进行路由的正则匹配
        self.regex = regex

        def to_python(self, value):
            """使用自定义转换器时会被调用"""
            return value

        def to_url(self, value):
            """使用url_for时会被调用"""
            print('url_for方法被调用')
            return '15811111111'

app.url_map.converters['re'] = RegexConverter

# 127.0.0.1:5000/send/18612345678
@app.route("/send/")
def send_msg(mobile):
    return 'send msg to %s' % mobile

@app.route('/login')
def login():
    # /send/13673483485
    url = url_for('send_msg', mobile='13673483485')
    return redirect(url)

if __name__ == '__main__':                                                                                                       
    # 启动flask程序                                                         
    app.run() 


flask路由规则及正则转换器converter9

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:Aura Components Basics on Trailhead —— Input Data Using Forms

下一篇:记一次 ffmpeg 接收rtsp异常

您可能感兴趣

  • 【计算机网络】第七章:网络安全

    【计算机网络】第七章:网络安全 目录 网络安全问题概述 1.1.计算机网络面临的安全性威胁 1.2.被动攻击和主动攻击 1.3.计算机网络通信安全的目标 1.4.恶意程序(rogue program) 1.5.计算机网络安全的内容 1.6.一般的数据加密模型 两类密码体制 一、对称密钥密码体制 1.1.对称密钥的缺点与优点 1.2.数据加密标准 DES 1.3.DES 的保密性 二、公钥密码...

  • 3dmax高级建模方法总结

    3Dmax有三种高级建模技术:多边形POLYGON建模、面片PATCH建模、NURBS(非均匀有理B样条曲线)建模。    01多边形建模    多边形建模是最为传统和经典的一种建模方式。3Dmax多边形建模方法比较容易理解,非常适合初学者学习,并且在建模的过程中用者有更多的想象空间和可修改余地。3Dmax中的多边形建模主要有两个命令:Editable Mesh(可编辑网格)和Editabl...

  • 工作流学习2(书本)

    1、流程引擎的创建。 1.1、ProcessEngineConfiguration的buildProcessEngine方法 使用ProcessEngineConfiguration的create方法可以得到ProcessEngineConfiguration的实例。ProcessEngineConfiguration中提供了一个buildProcessEngine方法,该方法返回一个Pro...

  • Unity渲染教程(九):复杂材质 https://www.jianshu.com/p/5e3af869870f

    Unity渲染教程(九):复杂材质 https://www.jianshu.com/p/5e3af869870f 同样的着色器,不同的贴图 用户界面 到目前为止,我们一直都为我们的材质使用Unity默认的材质监视器,它很耐用,但是Unity的标准着色器长得非常不一样。仿照着标准着色器,让我们一起来为我们自己的着色器创建一个自定义监视器吧。 我们默认的监视器和标准着色器监视器 着色器GUI 我...

  • 计算机科学第二讲——电子计算机

    目录 1、最大的机电计算机之一——哈佛 Mark 1 号 2、继电器 3、继电器出“bug” 4、热电子管——第一个真空管 5、三极真空管 6、"巨人1号" 计算机——首次大规模使用真空管 7、ENIAC ——第一个通用可编程计算机 8、晶体管 9、“硅谷”——肖克利半导体 → 仙童半导体 → 英特尔 提到的设备:继电器 → 真空管 → 晶体管 上一讲讲到 20 世纪初,当时的早期计算设备都...

  • kubernetes使用组件具体介绍

    1. kubernetes介绍 1.1. kubernetes介绍 kubernetes是一种开源的容器编排工具,通过调度系统维持用户预期数量和状态的容器正常运行。kubernetes提供的功能: 服务发现和负载均衡:Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。 存储编排 K...

  • 行业软件开发商怎样来抢 BI 这块蛋糕?

    随着企业信息化建设的深入,很多机构的生产系统已建设完成,在保证生产的有序进行后,如何更有效地进行经营决策成了管理者面临的最大任务。商业智能(BI)就是在这种背景成为支撑企业经营分析的一大利器。 根据 IDC 中国的报告,2020 年中国商业智能市场规模将达到 5.8 亿美元(约 40 亿元人民币),而且每年还以近 20% 的速度增长。目前企业对 BI 系统需求旺盛程度可见一斑。 不同于信息化...

  • K8s CNI网络最强对比:Flannel、Calico、Canal和W

    介 绍 网络架构是Kubernetes中较为复杂、让很多用户头疼的方面之一。Kubernetes网络模型本身对某些特定的网络功能有一定要求,但在实现方面也具有一定的灵活性。因此,业界已有不少不同的网络方案,来满足特定的环境和要求。 CNI意为容器网络接口,它是一种标准的设计,为了让用户在容器创建或销毁时都能够更容易地配置容器网络。在本文中,我们将集中探索与对比目前最流行的CNI插件:Flan...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。