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函数编程--闭包和装饰器 一.闭包 关于闭包,即函数定义和函数表达式位于另一个函数的函数体内(嵌套函数).而且,这些内部函数可以访问它们所在的外部函数中声明的所有局部变量.参数.当其中一个 ...
随机推荐
- React-native完整配置流程
开头敲黑板!! 无论你是RN的新手还是老手,跟着流程走,RN项目搭建起来完全不是问题! 一.网址收集 expo配置网址:https://blog.expo.io/building-a-react- ...
- Xilinx Vivado的使用详细介绍(3):使用IP核
ilinx Vivado的使用详细介绍(3):使用IP核 Author:zhangxianhe IP核(IP Core) Vivado中有很多IP核可以直接使用,例如数学运算(乘法器.除法器.浮点运算 ...
- 简单理解epel源
EPEL源-是什么全称 EPEL源 EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适 ...
- python小技巧---打印出不同颜色的输出
在调试代码时打印常常一种颜色,找个东西真的是很难,在一次听金角大王的视频中听到了个方法,也是喀什使用了,本来不打算做记录了,可是稍微有几天不用,还得翻之前的代码,找着也是听麻烦的,现在在这里做个记录 ...
- postgresql 空间函数 随笔
1. ST_Buffer(geometry, double, [integer])buffer操作一个很有用函数,这个函数的第一个参数是要操作的空间几何数据,第二个参数长度(距离),第三个参数为一个整 ...
- python两个列表合并为字典,一个作为key,一个作为value
两个列表合并为一个字典函数list_dic(list1,list2)可以直接复制拿走 传入的参数为两个列表,list1准备作为key,list2准备作为value,key和value位置一一对应. d ...
- MySQL数据库(2)
上一篇我们讲述过MySQL创建数据库,数据表的内容,其中涉及到了几个约束: NOT NULL 非空约束 PRIMARY KEY 主键约束 UNIQUE KEY 唯一约束 其实还有两个约束 ...
- Ios证书申请流程
1. 创建appId l 苹果开发网站→Account-overview下的Cerficates,IDs & Profiles→AppIDs,点击添加 l 填写App ID描述,在App ID ...
- Spring Websocket实现简易在线聊天功能
针对Spring Websocket的实现,我参照了其他博主的文章https://www.cnblogs.com/leechenxiang/p/5306372.html 下面直接给出实现: 一.引入相 ...
- 我是如何通过学习拿到年薪80w
本人做了5年Java,如今还是一个码农,天天写业务代码,直到2018年10月中旬遇到一位技术大牛,他给我一套技术思维导图让我又看到了希望!今天分享给各位想要提升.升职.加薪的你. 普通Java程序员与 ...