我用 flask 框架做一个网站的过程中,要用到装饰器,缩减版代码如下:
def testwra(func): print "testwra" def _wrapper(): print "wra" r = func() return r print "end" return _wrapper
@testwra @app.route('/users', methods=['GET']) def get_users(): return ['33', '44']
这里,正常的执行顺序不应该是 testwra->先后打印 testwra 和 end->调用_wrapper->打印 wra->调用 func()函数->返回 list->返回 r,但是我这里在浏览器中输入 url ( http://localhost:5000/users ),却不会打印 wra,好像是没有进入_wrapper 函数中。 而且还会报错 TypeError: 'list' object is not callable list 不是可以作为返回值的吗?
1
frostming 2018-09-27 10:26:09 +08:00
第 0 个问题,请注意排版好吧
第 1 个问题,app.route 会把它下面包裹的函数作为请求处理函数,这时候还没被 testwra 装饰自然没有打印 wra 第 2 个问题,请求处理函数只能返回(字符串,response,tuple )其中一种,你返回 list 不合法,请去看 flask/app.py/make_response 源码 |
2
frostming 2018-09-27 10:32:29 +08:00
更正:请求处理函数只能返回(字符串,response,tuple , WSGI callable )其中一种
|
3
fayefang OP @frostming 装饰器不是从上向下依次执行的吗,此时 testwra 不是已经先装饰了吗,为什么说没被装饰呢
|
5
xpresslink 2018-09-27 23:13:07 +08:00
最重要的事情说三遍,
装饰器是在编译时就执行,而不是调用时;装饰器只对函数进行装饰,不对装饰器进行装饰,谁贴函数近谁先。 装饰器是在编译时就执行,而不是调用时;装饰器只对函数进行装饰,不对装饰器进行装饰,谁贴函数近谁先。 装饰器是在编译时就执行,而不是调用时;装饰器只对函数进行装饰,不对装饰器进行装饰,谁贴函数近谁先。 这是关键。 |
6
sww4718168 2018-09-27 23:31:53 +08:00
|
7
fayefang OP @sww4718168 明白了,感谢🙏🏻
|
8
fayefang OP @xpresslink 了解了,感谢🙏🏻🙏🏻
|