zoukankan      html  css  js  c++  java
  • 使用url_for()时,会自动调用转换器的to_url()方法

    视图反推url,在动态url(转换器)反推中的应用

    # -*- coding: utf-8 -*-
    from  flask import Flask, url_for, redirect
    from werkzeug.routing import BaseConverter
    
    app = Flask(__name__)
    
    
    # 转换器
    # 127.0.0.1:5000/goods/123
    @app.route("/goods/<int:goods_id>")
    # @app.route("/goods/<goods_id>")  # 不加转换器类型, 默认是普通字符串规则(除了/的字符)
    def goods_detail(goods_id):
        """定义的视图函数"""
        return "goods detail page %s" % goods_id
    
    
    # 1. 定义自己的转换器
    class MobileConverter(BaseConverter):
        def __init__(self, url_map):
            super(MobileConverter, self).__init__(url_map)
            self.regex = r'1[34578]d{9}'
    
    
    class RegexConverter(BaseConverter):
        """"""
    
        def __init__(self, url_map, regex):
            # 调用父类的初始化方法
            super(RegexConverter, self).__init__(url_map)
            # 将正则表达式的参数保存到对象的属性中,flask会去使用这个属性来进行路由的正则匹配
            self.regex = regex
    
        def to_python(self, value):
            """"""
            print("to_python方法被调用")
            # return "abc"
            # value是在路径进行正则表达式匹配的时候提取的参数
            return value
    
        def to_url(self, value):
            """使用url_for的方法的时候被调用"""
            print("to_url方法被调用")
            return "15811111111"
            # return value
    
    
    # 2. 将自定义的转换器添加到flask的应用中
    app.url_map.converters["re"] = RegexConverter
    app.url_map.converters["mobile"] = MobileConverter
    
    
    # 127.0.0.1:5000/send/18612345678
    # @app.route("/send/<mobile:mobile_num>")
    @app.route("/send/<re(r'1[34578]d{9}'):mobile_num>")
    def send_sms(mobile_num):
        return "send sms to %s" % mobile_num
    
    
    @app.route("/index")
    def index():
        url = url_for("send_sms", mobile_num="18922222222")
        # /send/18922222222
        return redirect(url)
    
    
    if __name__ == '__main__':
        # 通过url_map可以查看整个flask中的路由信息
        print(app.url_map)
        # 启动flask程序
        app.run(debug=True)
    

      

    访问:http://127.0.0.1:5000/index

    跳转:http://127.0.0.1:5000/send/15811111111

    修改to_url后

  • 相关阅读:
    [0] 需求管理工具CaliberRM
    [0] 自动化测试工具QTP
    [0] UML建模工具(StarUML)
    [0] C# 扩展方法(Extension Method)
    [0] 统一软件过程(RUP)
    [0] XP敏捷开发
    关于ES6的let,const与var之间的三生三世
    lumen手记:自定义Validate表单验证
    window下python安装pip,切换为国内阿里云镜像
    Lumen开发:简单实现auth用户认证
  • 原文地址:https://www.cnblogs.com/andy9468/p/10871937.html
Copyright © 2011-2022 走看看