python flask route中装饰器的使用

Spider-spiders 2019-01-30 原文

python flask route中装饰器的使用

问题:route中的装饰器为什么感觉和平时使用的不太一样,装饰器带参数和不太参数有什么区别?被修饰的函数带参数和不带参数有什么区别?

测试1:装饰器不带参数,被修饰的函数也不带参数。

def log(func):
    print"execute log"
    print func
    def use_log():
        print "execute use log"
        def wrapper():
            print "start"
            func()
            print "end"
            return
        return wrapper
    return use_log

@log
def cal():
    print "1+2"

此时输出为:

execute log
<function cal at 0x7fa64535f668> #这里的function为cal的函数地址

如果执行cal()那么将会使用use_log函数,返回的是wrapper()

execute log
<function cal at 0x7f42ee7a4668>
execute use log

如果执行cal()的返回值,那么将执行cal()函数体的内容

result = cal()
result()

结果为:

execute log
<function cal at 0x7f38dc4d1668>
execute use log
start
1+2
end

测试2:如果装饰器带参数,被修饰的函数不带参数

def log(func): #这里的func为装饰器函数参数
    print"execute log"
    print func #这里的func为装饰器函数参数
    def use_log(func): #这里的func为函数cal()的地址
        print "execute use log"
        print func #这里的func为函数cal()的地址
        def wrapper():
            print "start"
            func()
            print "end"
            return
        return wrapper
    return use_log

@log('log')
def cal():
    print "1+2"

#这个时候数输出结果为:
execute log
log
execute use log
<function cal at 0x7f0c666b46e0>

 这个时候调用cal()那么将会执行wrapper()的函数体+cal()的函数体。

测试3:如果装饰器不带参数,被修饰的函数带参数

def log(func): #func 为cal()函数的地址
    print"execute log"
    def use_log(param): #param为cal的参数param
        print "execute use log"
        print param
        def wrapper():
            print "start"
            func(param) #func 为cal()函数的地址,param为cal的参数param
            print "end"
            return
        return wrapper
    return use_log

@log
def cal(param):
    print "1+2"

result = cal('cal')
result()

#执行的结果为:
execute log
execute use log
cal
start
1+2
end
#如果注掉最后两行代码,那么只有输出
execute log

 测试4:如果装饰器带参数,被修饰的函数也带参数。最复杂的情况。

def log(func): #func为装饰器的参数
    print"execute log"
    def use_log(func): #func为cal的函数地址
        print "execute use log"
        print func #func为cal的函数地址
        def wrapper(param): #param为cal的参数
            print "start"
            func(param)
            print "end"
            return
        return wrapper
    return use_log

@log('test')
def cal(param):
    print "1+2"

result = cal('cal')

#执行的结果为:
execute log
execute use log
<function cal at 0x7f23bbc6d6e0>
start
1+2
end

 

经过上面的分析之后,再看flask中使用的是哪种情况:

样例代码:

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    print 'execute hello function'
    return 'Hello, World!'

@app.route(‘/’)的代码如下:

 

    def route(self, rule, **options):
        """A decorator that is used to register a view function for a
        given URL rule.  This does the same thing as :meth:`add_url_rule`
        but is intended for decorator usage::

            @app.route('/')
            def index():
                return 'Hello World'

        For more information refer to :ref:`url-route-registrations`.

        :param rule: the URL rule as string
        :param endpoint: the endpoint for the registered URL rule.  Flask
                         itself assumes the name of the view function as
                         endpoint
        :param options: the options to be forwarded to the underlying
                        :class:`~werkzeug.routing.Rule` object.  A change
                        to Werkzeug is handling of method options.  methods
                        is a list of methods this rule should be limited
                        to (``GET``, ``POST`` etc.).  By default a rule
                        just listens for ``GET`` (and implicitly ``HEAD``).
                        Starting with Flask 0.6, ``OPTIONS`` is implicitly
                        added and handled by the standard request handling.
        """
        def decorator(f): 
            endpoint = options.pop('endpoint', None)
            self.add_url_rule(rule, endpoint, f, **options)
            print "this param has been accessed"
            return f
	return decorator

可以看到装饰器的参数为‘/’,被修饰的函数为:hello(),所以这里属于第二种情况,即使不调用hello()函数,decorator的函数体也是被执行的,也就是说,只要使用装饰器添加了路由规则,那么就会被加入到map中形成映射关系。

发表于 2019-01-30 14:49 都是一家人 阅读() 评论() 编辑 收藏

 

版权声明:本文为Spider-spiders原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Spider-spiders/p/10337798.html

python flask route中装饰器的使用的更多相关文章

  1. Python 编程语言要掌握的技能之一:善用变量来改善代码质量

    如何为变量起名 在计算机科学领域,有一句著名的格言(俏皮话): There are only two hard […]...

  2. sublime sublimecodeintel配置 python – xzj19870125

    sublime sublimecodeintel配置 python 参照https://www.cnblogs […]...

  3. python学习之路——day01

    什么是python? Python的创始人是Guido van Rossum , 因为他是一个叫Monty P […]...

  4. (数据科学学习手札116)Python+Dash快速web应用开发——交互表格篇(中)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataSc […]...

  5. 听歌识曲也太牛了吧!只“音”奥秘在此……

    摘要: 抖音等短视频软件的兴起,让一些不为大众所知的歌曲一夜爆红,当我们遇到中意的音乐却苦恼于找不到资源时,“ […]...

  6. python 机器学习多项式回归

    python 机器学习多项式回归   现实世界的曲线关系都是通过增加多项式实现的,现在解决多项式回归问题    […]...

  7. Python词频分析

    Python词频分析一、前言在日常工作或者生活中,有时候会遇到词频分析的场景。如果是要进行词频分析,那么首先需要对句子进行分词,将句子中的单词进行切割并按照词性进行归类。在Python中有个第三方库叫jieba(结巴),可以对文章或...

  8. 推荐一款Python神器,5 行 Python 代码 实现一键批量扣图 – 狂师

    推荐一款Python神器,5 行 Python 代码 实现一键批量扣图 2020-05-20 09:59  狂 […]...

随机推荐

  1. 【转载】常用统计软件下载地址大全

    几个常用的统计软件下载地址,比较经典的几个地址,希望对大家学习有所帮助,顺提醒一下:请不要用于商业用途,谢谢! […]...

  2. MySQL笔记

    目录 连接MySQL 数据库基本指令 备份恢复数据库/表 创建表 列类型(数据类型) 常用( [] 内是 字节 […]...

  3. mysql数据库传输到另个数据库 – 阳光总在风雨后001

    mysql数据库传输到另个数据库 选择要传输的数据库点击右键—-》数据传输—̵ […]...

  4. Spring系列之手写注解与配置文件的解析

    目录 Spring系列之IOC的原理及手动实现 Spring系列之DI的原理及手动实现 Spring系列之AO […]...

  5. Advanced Uninstall Manager for Mac(高级卸载管理工具)

    Mac卸载软件哪款好用?macw小编推荐这款高级卸载管理工具Advanced Uninstall Manage […]...

  6. 算法作业——第4章 贪心算法

    有空做完,期末复习。 第4章 贪心算法 习题 【+】阅读、掌握课本经典范例代码的实现:(1)活动安排问题;(2 […]...

  7. GitHub使用(二)– 从代码库下载代码到本地

    在上一篇文章中,我们说明了如何将本地的代码上传的GitHub的代码库中进行保管。在这篇文章中将继续向您介绍,如 […]...

  8. android面试题

    提问区: 1、什么是Activity? 2、请描述一下Activity生命周期。 3、两个Activity之间 […]...

展开目录

目录导航