一.使用

Flask中的特殊装饰器(中间件)方法常用的有三个

  • @app.before_request # 在请求进入视图函数之前
  • @app.after_request # 在请求结束视图函数之后 响应返回客户端之前
  • @app.errorhandler(404) # 重定义错误信息
  1. @before_request
  2. def func():
  3. pass
  4.  
  5. @after_request
  6. def func(ret): # 函数中要加参数
  7. pass
  8.  
  9. @app.errorhandler(404) # 错误代码
  10. def error404(errormessage): # 函数中要加参数
  11. pass

二.执行顺序

1. before_request返回值为None,正常状态具体分析

  1. from flask import Flask, request, session, redirect
  2.  
  3. app = Flask(__name__)
  4. app.secret_key = "#$%^&*("
  5.  
  6. @app.before_request # 在请求 之前
  7. def be1():
  8. print("be1")
  9.  
  10. @app.before_request # 在请求 之前
  11. def be2():
  12. print("be2")
  13.  
  14. @app.before_request # 在请求 之前
  15. def be3():
  16. print("be3")
  17.  
  18. @app.route("/")
  19. def index():
  20. print("index page")
  21. return "index page"
  22.  
  23. @app.after_request
  24. def af1(vf_ret):
  25. # vf_ret.response[0]=b'2000000 OK!'
  26. print("af1")
  27. return vf_ret
  28.  
  29. @app.after_request
  30. def af2(vf_ret):
  31. # vf_ret.response[0]=b'2000000 OK!'
  32. print("af2")
  33. return vf_ret
  34.  
  35. @app.after_request
  36. def af3(vf_ret):
  37. # vf_ret.response[0]=b'2000000 OK!'
  38. print("af3")
  39. return vf_ret
  40.  
  41. @app.errorhandler(404)
  42. def error404(error_message):
  43. print(error_message)
  44. # return f"你确定你要查看{request.path}这个页面吗?它已经走丢了,你快去找吧 "
  45. return redirect("http://baidu.com")
  46.  
  47. if __name__ == '__main__':
  48. app.run(debug=True)

结果

2. 如果在before_request中返回值不为空

  在before_request中返回值不为空的话,那么它会将每一个after_request都走一遍

  1. from flask import Flask, request, session, redirect
  2.  
  3. app = Flask(__name__)
  4. app.secret_key = "#$%^&*("
  5.  
  6. @app.before_request # 在请求 之前
  7. def be1():
  8. print('be1')
  9. return ''
  10.  
  11. @app.before_request # 在请求 之前
  12. def be2():
  13. print("be2")
  14.  
  15. @app.before_request # 在请求 之前
  16. def be3():
  17. print("be3")
  18.  
  19. @app.route("/")
  20. def index():
  21. print("index page")
  22. return "index page"
  23.  
  24. @app.route("/login")
  25. def login():
  26. print("正在登陆......")
  27. session["username"] = "username"
  28. return "login"
  29.  
  30. @app.after_request
  31. def af1(vf_ret):
  32. # vf_ret.response[0]=b'2000000 OK!'
  33. print("af1")
  34. return vf_ret
  35.  
  36. @app.after_request
  37. def af2(vf_ret):
  38. # vf_ret.response[0]=b'2000000 OK!'
  39. print("af2")
  40. return vf_ret
  41.  
  42. @app.after_request
  43. def af3(vf_ret):
  44. # vf_ret.response[0]=b'2000000 OK!'
  45. print("af3")
  46. return vf_ret
  47.  
  48. @app.errorhandler(404)
  49. def error404(error_message):
  50. print(error_message)
  51. # return f"你确定你要查看{request.path}这个页面吗?它已经走丢了,你快去找吧 "
  52. return redirect("http://baidu.com")
  53.  
  54. if __name__ == '__main__':
  55. app.run(debug=True)

结果:

Flask系列06--(中间件)Flask的特殊装饰器 before_request,after_request, errorhandler的更多相关文章

  1. Flask 中的 特殊装饰器before_request/after_request

    before_request :在请求收到之前绑定一个函数做一些事情. after_request: 每一个请求之后绑定一个函数,如果请求没有异常. teardown_request: 每一个请求之后 ...

  2. python全栈开发day111-flask路由及其参数,Flask配置,蓝图,几个装饰器、闪现、send_file、jsonify

    1.endpoint参数,解决视图函数重名问题(包括装饰后重名问题) http://www.cnblogs.com/eric-nirnava/p/endpoint.html 每个应用程序app都有一个 ...

  3. Flask中的before_request装饰器和after_request装饰器以及WTForms组件

    一.before_request装饰器和after_request装饰器 我们现在有一个Flask程序其中有3个路由和视图函数 from flask import Flask app = Flask( ...

  4. 浅谈Django的中间件与Python的装饰器

    浅谈Django的中间件 与Python的装饰器 一.原理 1.装饰器是Python的一种语法应用,利用闭包的原理去更改一个函数的功能,即让一个函数执行之前先到另外一个函数中执行其他需求语句,在执行该 ...

  5. Flask框架实现给视图函数增加装饰器操作示例

    在@app.route的情况下增加装饰器的写法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 2 ...

  6. flask系列四之SQLAlchemy(二)表关系

    一.SQLAlchemy外键约束 1.创建外键约束表结构 目标:建立两个表“用户表(user)”和“问题表( question)”,其中问题表中的作者id是是用户表的id即外键的关系.(一个用户可以有 ...

  7. Flask 页面缓存逻辑,jinja2 过滤器,测试器

    回调接入点-页面缓存逻辑 from flask import Flask,request,render_template from werkzeug.contrib.cache import Simp ...

  8. Django基础七之CBV装饰器和中间件

    Django基础七之CBV装饰器和中间件 目录 Django基础七之CBV装饰器和中间件 1. CBV加装饰器 2. Django中间件 2.1 Django中间件介绍 2.2 自定义中间件 2.2. ...

  9. python27期day14:有参装饰器、多个装饰器装饰一个函数、递归、作业题

    1.有参装饰器:给装饰器添加一个参数.来控制装饰器的行为. @auth(参数) auth里层的函数名 = auth(参数) 被装饰的函数名 = auth里层的函数名(被装饰的函数名) 被装饰的函数名( ...

随机推荐

  1. 如何将service绑入到spring 并且在action中使用

    第一步:定制 service接口,为什么用接口我也不清楚 package com.inspur.services; import com.hsp.domain.User; public interfa ...

  2. ios 内存管理与property copy strong weak assign

    - (void)fun{  NSString* str = [[NSString alloc] initWithString:@"string"];  NSLog(@"% ...

  3. linux_修改ip(重启后永久生效)

    vi /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 TYPE=Ethernet UUID=a20869f2-4095-4e5d-9b0c- ...

  4. kbmmw 的远程桌面功能2-android手机端

    前面讲了PC 端的远程操作,今天讲一下如何用手机控制远程桌面(真的能操作的很爽吗?), 要使手机可以远程控制,首先在在kbmmwconfig.inc 文件里面加入FMX 支持 {$DEFINE KBM ...

  5. 前端之javascript的数据类型1和BOM对象

    一 js对象 BOM对象:browser object model浏览器模型对象 window对象:定时器 DOM对象:文档对象模型 js对象:字符串对象,数组对象,日期对象,math对象 new关键 ...

  6. 2018.12.08 codeforces 948D. Perfect Security(01trie)

    传送门 01trie板子题. 给出两个数列,允许把第二个数列重新排列. 求使得两个数列每个位置对应的数的异或值和成为最小值的每个位置的异或和. 把第二个数列插入到01trie里面然后对于第一个数列中的 ...

  7. JSON_FORCE_OBJECT 数字索引数组 强转对象

    $abc = array('a','b','c','d','e','f','g'); echo '<pre>'; var_dump($abc); echo json_encode($abc ...

  8. oracle创建视图(view)

    视图:是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以对表里面的数据进行查询和修改.视图基于的表称为基表,Oracle的数据库对象分为五种:表,视图,序列,索引和同义词. 视图是存储在数 ...

  9. Latex插图操作

    1.竖排插入两张图 \begin{figure}[h] //放在当前位置 \centering \subfigure[A given traffic flow set]{ \includegraphi ...

  10. C++STL 预定义函数对象和函数适配器

    预定义函数对象和函数适配器 预定义函数对象基本概念:标准模板库STL提前定义了很多预定义函数对象,#include <functional> 必须包含. 1使用预定义函数对象: void ...