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
+
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中形成映射关系。
python flask route中装饰器的使用的更多相关文章
- python中装饰器的执行细节
本文代码借用 廖雪峰的python教程(官网:http://www.liaoxuefeng.com/) 不了解装饰器的可以先看教程 直接上带参数装饰器的代码 def log(text): def de ...
- 8.Python中装饰器是什么?
Python中装饰器是什么? A Python decorator is a specific change that we make in Python syntax to alter functi ...
- 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法
第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一. 案例说明 本节定义了类Sta ...
- Python 入门之 Python三大器 之 装饰器
Python 入门之 Python三大器 之 装饰器 1.开放封闭原则: (1)代码扩展进行开放 任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代 ...
- python函数与方法装饰器
之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...
- guxh的python笔记三:装饰器
1,函数作用域 这种情况可以顺利执行: total = 0 def run(): print(total) 这种情况会报错: total = 0 def run(): print(total) tot ...
- python设计模式之内置装饰器使用(四)
前言 python内部有许多内建装饰器,它们都有特别的功能,下面对其归纳一下. 系列文章 python设计模式之单例模式(一) python设计模式之常用创建模式总结(二) python设计模式之装饰 ...
- python 3.x 的装饰器笔记
今天学到了python的装饰器,感觉这个东西还是稍微有些复杂,所以记录下来,方便以后的查找.虽然标题是python 3.x的装饰器,但是我也没有怎么用过python 2.x,感觉上应该是和python ...
- Python函数编程——闭包和装饰器
Python函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...
随机推荐
- vue 组件之间相互传值 父传子 子传父
1.父传子 把要传入的值放到父标签里 子组件使用props接收 父写法 子写法 2.子传父 子组件: childrenOnclick() { // 发布自定义事件 this.$emit(" ...
- ES6多层解构
const info = { person: { name: 'xiaobe', other: { age: 22, } }, song: 'rolling', } // 解构person的内容 co ...
- HTTP响应 状态码描述
- 浅谈企业IT技术运营中台
关注嘉为科技,获取运维新知 如果你是IT圈内的人,在2月份,你的朋友圈里面最火的词应该就是“中台”了,我们在此不讨论企业的技术中台.数据中台.AI中台.业务中台,想和大家讨论一下IT技术运营中台. “ ...
- python内置函数详细描述与实例演示
python有许多内置函数,列出表格如下 内置函数 abs() delattr() hash() memoryview() set() all() dict() help() min() setatt ...
- 『Python』为什么调用函数会令引用计数+2
一.问题描述 Python中的垃圾回收是以引用计数为主,分代收集为辅,引用计数的缺陷是循环引用的问题.在Python中,如果一个对象的引用数为0,Python虚拟机就会回收这个对象的内存. sys.g ...
- 4、static
static (静态的),用来修饰成员. 一.特点: 1.被修饰的方法或变量随着类的加载而加载 2.优先于对象存在 3.被所有的对象共享 4.除了可以被对象调用还可以被类名直接调用 二.类变量.成员变 ...
- Loadrunner与idea编写加密的java Vusers脚本总结
Loadrunner与idea编写加密的java Vusers脚本总结 准备工作: jdk版本的选择: Loadrunner11 使用版本jdk1.6 32位(如果使用1.7的Load ...
- docker 安装elasticSearch7.0.0
一.执行命令:docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-n ...
- Request中的各种地址
今天来得匆忙,先上图吧,稍后再整理!