当前位置:   article > 正文

python使用装饰器实现面向切面编程

python使用装饰器实现面向切面编程

一,装饰器的概念与使用

文章见https://www.jb51.net/article/153214.htm,本文不做过多赘述

二,装饰器实现面向切面编程的具体方法

众所周知,装饰器是python的语法糖,对于简化代码书写,提高代码复用具有很大意义,装饰器常用于打印日志,计时器,登录检查,其中django的login_required便是对页面访问进行约束,只有登陆才能访问页面,装饰器的作用包括但不仅限于此。

举个例子:

当前楼主的需求是:

假设django视图中存在耗时操作,但是遇到耗时操作,客户端便存在等待时间,这极大的影响了客户体验,俗话说用户就是上帝,我们需要制造一些假数据返回前台,告诉前台,后台数据在取数据这块由于不要可抗力造成卡顿延误。

菜鸟级解决方案:

对于每一个视图,增加超时时间,超时即返回默认空json字符串给前台

  1. import json
  2. import time
  3. import signal
  4. from django.http import HttpResponse
  5. def view1():
  6. try:
  7. signal.signal(signal.SIGALRM, myHandler)
  8. signal.alarm(1) # 设置超时时间一秒
  9. response = urllib2.urlopen("某一耗时网站A")
  10. result_str = json.loads(response.read())
  11. signal.alarm(0)
  12. return HttpResponse(result_str, content_type="application/json")
  13. except:
  14. return HttpResponse({}, content_type="application/json")
  15. def view2():
  16. try:
  17. signal.signal(signal.SIGALRM, myHandler)
  18. signal.alarm(1) # 设置超时时间一秒
  19. response = urllib2.urlopen("某一耗时网站B")
  20. result_str = json.loads(response.read())
  21. signal.alarm(0)
  22. return HttpResponse(result_str, content_type="application/json")
  23. except:
  24. return HttpResponse({}, content_type="application/json")
  25. def view3():
  26. try:
  27. signal.signal(signal.SIGALRM, myHandler)
  28. signal.alarm(1) # 设置超时时间一秒
  29. response = urllib2.urlopen("某一耗时网站C")
  30. result_str = json.loads(response.read())
  31. signal.alarm(0)
  32. return HttpResponse(result_str, content_type="application/json")
  33. except:
  34. return HttpResponse({}, content_type="application/json")
  35. def view4():
  36. try:
  37. signal.signal(signal.SIGALRM, myHandler)
  38. signal.alarm(1) # 设置超时时间一秒
  39. response = urllib2.urlopen("某一耗时网站D")
  40. result_str = json.loads(response.read())
  41. signal.alarm(0)
  42. return HttpResponse(result_str, content_type="application/json")
  43. except:
  44. return HttpResponse({}, content_type="application/json")

普通人解决方案,显然利用第二种方案,使用装饰器后不仅将代码模块化,而且更能清晰明了的表达代码作用

  1. def TimeOut(func):
  2. def function(*args, **kwargs):
  3. try:
  4. signal.signal(signal.SIGALRM, myHandler)
  5. signal.alarm(1)
  6. stime = time.time()
  7. print("程序开始运行")
  8. func(*args, **kwargs)
  9. print("程序结束运行")
  10. print(time.time() - stime)
  11. signal.alarm(0)
  12. except:
  13. return HttpResponse({}, content_type="application/json")
  14. return function
  15. @TimeOut
  16. def view1():
  17. response = urllib2.urlopen("某一耗时网站A")
  18. result_str = json.loads(response.read())
  19. signal.alarm(0)
  20. return HttpResponse(result_str, content_type="application/json")
  21. @TimeOut
  22. def view2():
  23. response = urllib2.urlopen("某一耗时网站B")
  24. result_str = json.loads(response.read())
  25. return HttpResponse(result_str, content_type="application/json")
  26. @TimeOut
  27. def view3():
  28. response = urllib2.urlopen("某一耗时网站C")
  29. result_str = json.loads(response.read())
  30. return HttpResponse(result_str, content_type="application/json")
  31. @TimeOut
  32. def view4():
  33. response = urllib2.urlopen("某一耗时网站D")
  34. result_str = json.loads(response.read())
  35. return HttpResponse(result_str, content_type="application/json")

大神解决方案:对于每个视图函数定制化的返回需要的结果

  1. def TimeOut(view):
  2. def wrap(func):
  3. def function(*args, **kwargs):
  4. try:
  5. signal.signal(signal.SIGALRM, myHandler)
  6. signal.alarm(1)
  7. stime = time.time()
  8. print("程序开始运行")
  9. func(*args, **kwargs)
  10. print("程序结束运行")
  11. print(time.time() - stime)
  12. signal.alarm(0)
  13. except:
  14. if view == "view1":
  15. dict = "view1需要返回的结果"
  16. if view == "view2":
  17. dict = "view2需要返回的结果"
  18. if view == "view3":
  19. dict = "view3需要返回的结果"
  20. if view == "view4":
  21. dict = "view4需要返回的结果"
  22. return HttpResponse(dict, content_type="application/json")
  23. return function
  24. return wrap
  25. @TimeOut("view1")
  26. def view1():
  27. response = urllib2.urlopen("某一耗时网站A")
  28. result_str = json.loads(response.read())
  29. signal.alarm(0)
  30. return HttpResponse(result_str, content_type="application/json")
  31. @TimeOut("view2")
  32. def view2():
  33. response = urllib2.urlopen("某一耗时网站B")
  34. result_str = json.loads(response.read())
  35. return HttpResponse(result_str, content_type="application/json")
  36. @TimeOut("view3")
  37. def view3():
  38. response = urllib2.urlopen("某一耗时网站C")
  39. result_str = json.loads(response.read())
  40. return HttpResponse(result_str, content_type="application/json")
  41. @TimeOut("view4")
  42. def view4():
  43. response = urllib2.urlopen("某一耗时网站D")
  44. result_str = json.loads(response.read())
  45. return HttpResponse(result_str, content_type="application/json")

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/44682?site
推荐阅读
相关标签
  

闽ICP备14008679号