Python利用装饰器实现类似于flask路由

目录
  • 1.例子1
  • 2.python 利用装饰器实现类似于flask路由

1.例子1

def f1():
    print(1111)

def f2():
    print(2222)

if __name__ == '__main__':
    print(33)

打印结果:

33

在例子1中,f1() 与f2() 都没有被调用,只执行了print(33)

f1与f2,是没有被调用的,但是如果f1 和 f2 上面有注解,就会被调用执行。

2.python 利用装饰器实现类似于flask路由

注释类 Grass

# -*- coding:utf-8 -*-
# @Author: 喵酱
# @time: 2023 - 02 -21
# @File: grass.py

from types import FunctionType

class Grass(object):
    # 字典,key 是 用户输入的路由
    # value,是调用对应的函数
    url_map = {}

    def router(self,url):
        def decorator(f: FunctionType):
            self.add_url_to_map(url,f)
            # return f
        return decorator

    # f 指的是一个函数
    def add_url_to_map(self,url,f):
        self.url_map[url] = f

    def run(self):
        while True:
            url = input("请输入URL: ")
            try:
                print(self.url_map[url]())
            except Exception as e:
                print(404)
                print(e)

运行入口

# -*- coding:utf-8 -*-
# @Author: 喵酱
# @time: 2023 - 02 -21
# @File: blog.py

from grass import Grass

app = Grass()

@app.router("/home")
def home():
    print("欢迎来到首页")
    return "首页"

@app.router("/index")
def index():
    print("欢迎来到列表页")
    return "列表页"

if __name__ == '__main__':
    app.run()

运行app.run()

然后输入 :

/home
/index
/mine

分析实现逻辑:

当运行app.run() 时,代码运行逻辑是

1、先执行1 实例化Grass对象

2、装饰器@app.router("/home") 运行

3、装饰器@app.router("/index") 运行

4、最后才是app.run() 运行

装饰器@app.router("/home") 运行逻辑

装饰器@app.router("/home"),运行

@app.router("/home") 对应 def router(self,url):

1、“/home” 传给 def router(self,url),url =“/home”

2、@app.router("/home"),运行得到 decorator函数

3、然后将home函数作为参数,传递给decorator函数

4、self.add_url_to_map(url,f)

将 url(“/home”) 与 home 函数组成 字典。

在字典中,字符串 /home 对应home 函数

以上就是Python利用装饰器实现类似于flask路由的详细内容,更多关于Python装饰器实现flask路由的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python flask路由间传递变量实例详解

    我查了一下解决这个问题的办法,一般是设定全局变量,今天介绍一种新办法 上代码difrouters.py from flask import Flask, render_template app = Flask(__name__) class DataStore(): a = None c = None data = DataStore() @app.route("/index") def index(): a=3 b=4 c=a+b data.a=a data.c=c return r

  • python:动态路由的Flask程序代码

    如下所示: # Copyright (c)2018, 东北大学软件学院学生 # All rightsreserved # 文件名称:a.py # 作 者:孔云 #问题描述: from flask import Flask app=Flask(__name__) @app.route('/') def index(): return '<h1>Flask Web程序开始了....<h1>' @app.route('/user/<name>') def user(name)

  • python框架flask入门之路由及简单实现方法

    路由 简单来说,路由就是一个url到函数的映射,通过路由规则,可以使得url被指定的函数进行处理解析. 我们都知道现在的web系统的URL都是可以自定义的,也就是我们可以指定url和具体的业务控制器相关联,而这些就是通过路由来实现的. flask中集成了路由处理模块,我们只需要简单地使用route装饰器就可以实现路由匹配. @app.route('/') def index(): return 'Index Page' @app.route('/hello') def hello(): retu

  • python Flask 装饰器顺序问题解决

    上周 RealWorld CTF 2018 web 题 bookhub 有个未授权访问的漏洞,比较有意思,赛后看了一下公开的 WriteUp,大家也都没写清楚,所以就有了这篇博文. 前言 这个题是用 flask 框架写的,在 www/bookhub/views/user.py 中, refresh_session 方法存在未授权访问漏洞,代码是这样写的: @login_required @user_blueprint.route('/admin/system/refresh_session/',

  • Python利用装饰器实现类似于flask路由

    目录 1.例子1 2.python 利用装饰器实现类似于flask路由 1.例子1 def f1(): print(1111) def f2(): print(2222) if __name__ == '__main__': print(33) 打印结果: 33 在例子1中,f1() 与f2() 都没有被调用,只执行了print(33) f1与f2,是没有被调用的,但是如果f1 和 f2 上面有注解,就会被调用执行. 2.python 利用装饰器实现类似于flask路由 注释类 Grass #

  • python用装饰器自动注册Tornado路由详解

    第一个版本 在这个版本中,首先创建了 RouterConfig 对象,其构造方法创建了 tornado.web.Application() 并赋值为 self.Application ,在每个 Handler 上添加 @app.route 装饰器,对应的就是 RouterConfig 下面的 route 对象,其中 Handler 实例会被赋值到 handler 参数中,最后把 URL 和 Handler 对应关系添加到路由表中, URL 在每个 Handler 中创建的属性. #!/usr/b

  • python利用装饰器进行运算的实例分析

    今天想用python的装饰器做一个运算,代码如下 >>> def mu(x): def _mu(*args,**kwargs): return x*x return _mu >>> @mu def test(x,y): print '%s,%s' %(x,y) >>> test(3,5) Traceback (most recent call last): File "<pyshell#111>", line 1, in

  • 详解利用装饰器扩展Python计时器

    目录 介绍 理解 Python 中的装饰器 创建 Python 定时器装饰器 使用 Python 定时器装饰器 Python 计时器代码 其他 Python 定时器函数 使用替代 Python 计时器函数 估计运行时间timeit 使用 Profiler 查找代码中的Bottlenecks 总结 介绍 在本文中,云朵君将和大家一起了解装饰器的工作原理,如何将我们之前定义的定时器类 Timer 扩展为装饰器,以及如何简化计时功能.最后对 Python 定时器系列文章做个小结. 这是我们手把手教你实

  • python重试装饰器示例

    利用python 写一些网络服务的时候,当网络状况不好,或者资源占用过多,任务拥塞的情况下,总会抛出一些异常,当前任务就被终止了,可以很好的利用@装饰器,写一个重试的装饰器,这样比较python!执行结果: 复制代码 代码如下: WARNING:root:timed out, Retrying in 3 seconds...WARNING:root:timed out, Retrying in 6 seconds...WARNING:root:timed out, Retrying in 12

  • Python类装饰器实现方法详解

    本文实例讲述了Python类装饰器.分享给大家供大家参考,具体如下: 编写类装饰器 类装饰器类似于函数装饰器的概念,但它应用于类,它们可以用于管理类自身,或者用来拦截实例创建调用以管理实例. 单体类 由于类装饰器可以拦截实例创建调用,所以它们可以用来管理一个类的所有实例,或者扩展这些实例的接口. 下面的类装饰器实现了传统的单体编码模式,即最多只有一个类的一个实例存在. instances = {} # 全局变量,管理实例 def getInstance(aClass, *args): if aC

  • Python 函数装饰器详解

    目录 使用场景 授权(Authorization) 日志(Logging) 带参数的装饰器 在函数中嵌入装饰器 装饰器类 总结 装饰器(Decorators)是 Python 的一个重要部分.简单地说:他们是修改其他函数的功能的函数.他们有助于让我们的代码更简短,也更Pythonic(Python范儿).大多数初学者不知道在哪儿使用它们,所以我将要分享下,哪些区域里装饰器可以让你的代码更简洁.首先,让我们讨论下如何写你自己的装饰器. 这可能是最难掌握的概念之一.我们会每次只讨论一个步骤,这样你能

  • python @property 装饰器使用方法

    目录 一.property的装饰器用法 二.举例说明 1.不用setter和getter方法的实现 2.使用setter和getter的实现,增加温度值输入的限制 3.利用property装饰器实现的版本 一.property的装饰器用法 先简单上个小栗子说明: class property(fget=None,fset=None,fdel=None,doc=None) fget是用于获取属性值的函数 fset是用于设置属性值的函数 fdel是用于删除属性值的函数 doc为属性对象创建文档字符串

  • python知识:装饰器@property到底有啥用途

    目录 一.提要 二.关于属性的约定 2.1 类绑定属性 2.2 对象绑定属性 2.3 私有属性 三.应用@property装饰器 3.1 将一个属性转成方法 3.2 私有化某些属性 3.3 关联性修改 3.4 删除属性的deleter方法 四.property()函数原理 总结 一.提要 python的@property是python的一种装饰器,是用来修饰方法的. python @property 装饰器使一个方法可以像属性一样被使用. 除此之外,还有几个使用场景,本文将叙述这些使用技巧. 二

  • python函数装饰器用法实例详解

    本文实例讲述了python函数装饰器用法.分享给大家供大家参考.具体如下: 装饰器经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解决这类问题的绝佳设计, 有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用.概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能. #! coding=utf-8 import time def timeit(func): def wrapper(a): start = time.clock() func

随机推荐