2019独角兽企业重金招聘Python工程师标准>>>

一、问题分析

具体问题可见:Python 的装饰器执行顺序问题

原代码如下:

def testwra(func):print "testwra"def _wrapper():print "wra"r = func()return rprint "end"return _wrapper@testwra
@app.route('/users', methods=['GET'])
def get_users():return ['33', '44']

直接执行,在输入/users网址之前,便会输出testwra和end,紧接着输入网址之后,便会出现下面的错误:

分析错误原因,@testwra装饰器在前面,@app.route装饰器在后面,所以在输入网址route之后执行的是没被testwra装饰的get_users,故而数据并没有经过序列化处理,返回到页面的仍然是list。再根据错误提示,返回值必须是字符串,元祖,响应实例,或者是可调用的WSGI,不能是list,所以出错。

二、问题解决

在前辈帮助下,发现了问题所在,就是装饰器的执行顺序问题。

修改代码如下(修改了装饰器的顺序,以及将list转为json再输出):

def testwra(func):print "testwra"def _wrapper():print "wra"r = func()return json.dumps(r)print "end"return _wrapper@app.route('/users', methods=['GET'])
@testwra
def get_users():return ['33', '44']

再次执行,在输入/users网址之前,便会依次输出testwra和end,紧接着输入网址之后,便会输出wra,然后在网页上便能看到执行结果如下图所示。

执行结果:

三、问题回顾

要想在输入users之后,正常对['33', '44']进行序列化并进行显示,应将@testwra装饰器放在@app.route装饰器之后才有效。这个时候输入网址route到相应的处理函数时,get_users已经经过testwra序列化处理,所以便能够正常显示序列化后的["33", "44"]。

转载于:https://my.oschina.net/u/3636678/blog/2209450

Python 的装饰器执行顺序问题(二)相关推荐

  1. Python装饰器执行顺序详解

    探究多个装饰器执行顺序 装饰器是Python用于封装函数或代码的工具,网上可以搜到很多文章可以学习,我在这里要讨论的是多个装饰器执行顺序的一个迷思. 疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会 ...

  2. python多个装饰器执行顺序_Python面试题之多个装饰器执行顺序

    疑问 大部分涉及多个装饰器装饰的函数调用顺序时都会说明它们是自上而下的,比如下面这个例子:def decorator_a(func): print 'Get in decorator_a' def i ...

  3. python装饰器执行顺序

    2019独角兽企业重金招聘Python工程师标准>>> 1.单个装饰器执行 上来先看代码: import timedef deco(func):@functools.wraps(fu ...

  4. python两个装饰器执行顺序_python中多个装饰器的执行顺序

    今天讲一下python中装饰器的执行顺序,以两个装饰器为例. 装饰器代码如下: def wrapper_out1(func): print('--out11--') def inner1(*args, ...

  5. python两个装饰器执行顺序_python中多个装饰器的执行顺序详解

    装饰器是程序开发中经常会用到的一个功能,也是python语言开发的基础知识,如果能够在程序中合理的使用装饰器,不仅可以提高开发效率,而且可以让写的代码看上去显的高大上^_^ 使用场景 可以用到装饰器的 ...

  6. python装饰器执行顺序_python unittest单元测试框架-3用例执行顺序、多级目录、装饰器、fixtures...

    1.用例执行顺序 unittest默认会按照ascii码的顺序,依次执行.类名--方法名排序,使用discover也是默认排序.如果不想使用默认排序,就使用testsuite测试集的方式. impor ...

  7. js中的装饰器执行顺序

    /*** 执行顺讯* [(property)...]->[(parameter->method)...]->constructor->class* [属性...]->[( ...

  8. python装饰器原理-Python函数装饰器原理与用法详解

    本文实例讲述了Python函数装饰器原理与用法.分享给大家供大家参考,具体如下: 装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值 ...

  9. python 函数装饰器_python函数装饰器的用法

    函数装饰器: 开闭原则:在面向对象编程领域中,开闭原则规定"软件中的对象(类,模块,函数等等)应该对于扩展是开放的, 但是对于修改是封闭的",这意味着一个实体是允许在不改变它的源代 ...

最新文章

  1. 【转】Java代码操作Redis的sentinel和Redis的集群Cluster操作
  2. android studio控件使用方法,android studio使用教程
  3. go语言任意代码执行漏洞 cve-2018-6574
  4. mfc 加密解密_[源码和文档分享]基于MFC实现的AES加密解密程序
  5. Android 获取手机通讯录信息 — 头像、姓名和A-Z的快速查询
  6. OpenCV-Python图像处理教程(源码及素材)
  7. Codeforces 888E - Maximum Subsequence
  8. IDEA如何安装主题
  9. linux 游戏手柄 驱动,forev手柄驱动
  10. SQL语句查询关键字
  11. python glob.glob()
  12. termux是等于linux终端,termux终端
  13. 【小河今学 | Bootstrap-v3+animate+wow】制作一个简单的响应式网站
  14. Node.js中的egg入门、egg路由、egg控制器、egg服务、egg中间件
  15. Android 8.1 Audio框架(二)AudioPolicy路由策略实例分析
  16. Android 外卖订餐APP开发
  17. 化合物相似性搜索_分子形状相似性及其应用
  18. solidworks装配体改为柔性_Y型钣金通风管道用SOLIDWORKS怎么建模?
  19. 【5G架构】5G 核心网架构概述
  20. 最优二叉查找树 次优二叉查找树 最优二叉树

热门文章

  1. boost::log模块实现宽字符日志记录示例
  2. boost::boost::stoer_wagner_min_cut用法的测试程序
  3. boost::gil::view_is_mutable用法的测试程序
  4. boost::is_output_streamable用法的测试程序
  5. boost::container实现显式实例化列表的测试程序
  6. VTK:可视化之VectorText
  7. VTK:可视化之AlphaFrequency
  8. VTK:相互作用之TrackballCamera
  9. OpenCV背景减法Background Subtraction Methods
  10. OpenCV用代码解释单应性的基本概念