请求扩展

before_request

类似于django中的process_request,在收到请求之后,进入视图函数之前,进行一些数据或者怎样的处理

  • 可写多个before_request函数
  • 从上往下执行的
  • 一旦有返回值,请求的视图函数不会执行,已经剩下的before_request不会执行
from flask import Flask,render_template,request,redirect,session,url_for

app = Flask(__name__)
app.debug = True
app.secret_key = "123#234" USERS = {
1:{"name":"老大", "age":19,"gender":"男", "resume":"言语措辞间都能体会到今日头条的谨小慎微,生怕再出现任何问题……."},
2:{"name":"老二", "age":18,"gender":"女", "resume":"当打开这款APP之后,就会发现这跟已经“死”去的内涵段子简直是一模一样。更厉害的地方是,它还支持用用户迁移内涵段子上的内容信息。"},
3:{"name":"老三", "age":17,"gender":"男", "resume":"如果狒狒会说人话,他肯定是在说:喂…你怎么只给我吃了一口就跑了呀,我还没吃饱啊…喂喂喂…给我回来呀!哈哈哈"},
} # 基于flask里请求扩展来做
@app.before_request
def process_request(*args, **kwargs):
# 验证表示,任何地址请求都会先执行before_request,所以登录验证就可以在before_request里做用户认证功能了
print("其他请求之前就执行了process_request")
# 4.访问/login的时候还没有登录,就会一直重定向到登录页,所以就要设置个白名单,如果请求地址是/login,就返回None
if request.path == "/login":
return None
# 1.登录验证功能
user = session.get('user_info')
# 2.如果登录信息正常,什么都不做,程序继续其他执行
if user:
return None
# 3.如果登录验证不通过,就重定向到登录页面
return redirect("/login") @app.route("/detail/<int:nid>", methods=['GET'])
def detail(nid):
detail_info = USERS.get(nid)
# 如果有值,就跳到详情页
return render_template("detail.html",info = detail_info) @app.route("/index", methods=['GET'])
def index():
return render_template("index.html", user_dict=USERS) @app.route("/login", methods=['GET', 'POST'], endpoint='l1')
def login():
if request.method =="GET":
return render_template("login.html")
else:
user = request.form.get("username")
pwd = request.form.get("password")
if user == "alex" and pwd =="123456":
session['user_info'] = user
return redirect("/index")
return render_template("login.html", **{"error":"用户名和密码错误"}) if __name__ == "__main__":
app.run()

after_request

类比django中间件中的process_response,每一个请求之后绑定一个函数,如果请求没有异常

  • 可以写多个after_request函数
  • 所有的after_request是从下往上执行,和before_request相反
  • 无论 before_request有没有返回值,我的after_request都会执行
  • 必须接受response,而且必须返回response
from flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)
app.debug = True
app.secret_key = 'siuljskdjfs' @app.before_request
def process_request1(*args,**kwargs):
print('process_request1 进来了') @app.after_request
def process_response1(response):
print('process_response1 走了')
# after_request 必须返回 response
return response # 视图函数
@app.route('/index',methods=['GET'])
def index():
print('index函数')
return "Index" if __name__ == '__main__':
app.run()

before_first_request

项目启动后,接受到的第一个请求,会执行该函数,后面就不会在执行

​ 比如:数据库的连接,初始化操作

from flask import Flask,request
app = Flask(__name__)
app.debug = True # 内部其实就有个判断,初始值是FALSE,第一次执行后将值改变为True,以后判断后就不执行了
@app.before_first_request
def before_first_request2():
print('before_first_request2') if __name__ == '__main__':
app.run()

teardown_request

每一个请求之后绑定一个函数,即使遇到了异常 ,也不会终止函数的执行

  • 这是e 是接收我服务器抛出的异常
  • 无论我服务器有没有错误,都会执行该函数
  • 虽然能接收异常,但是没有办法处理异常
  • 可以用来监控程序是否报错,记录日志
#如论有无异常都执行,如果没有异常这个e就是None
@app.teardown_request
def ter(e):
# if e:
#logingh
# return "wo si l"
print("我抛异常")

errorhandler

定制错误信息:

  • 参数的中值为错误码
  • 当服务器抛出对应状态码的异常,就会执行该函数
  • 并且该函数可以处理异常,让用户无法感知,服务器错误
  • 每一个错误码,都需要一个对应的函数进行处理
from flask import Flask,render_template,request,redirect,session,url_for
app = Flask(__name__)
app.debug = True
app.secret_key = 'siuljskdjfs' # 经常会出现url不存在的情况,一般会有错误信息
# 而这个错误信息也是可以进行定制的,根据错误码定制错误信息方法如下:
@app.errorhandler(404)
def error_404(arg):
return "404错误了" # 视图函数
@app.route('/index',methods=['GET'])
def index():
print('index函数')
return "Index" if __name__ == '__main__':
app.run()

template_global

模板中定制方法/定制模板方法:

from flask import Flask,request
app = Flask(__name__)
app.debug = True # 这就是基于请求扩展的 定制模板方法
# 相对于在模板里定制了一个函数 @app.template_global()
def sb(a1, a2):
return a1 + a2 # 在HTML里调用的方式:{{sb(1,2)}} if __name__ == '__main__':
app.run()

template_filter

过滤器

from flask import Flask,request
app = Flask(__name__)
app.debug = True # 这就是基于请求扩展的 定制模板方法
@app.template_filter()
def db(a1, a2, a3):
return a1 + a2 + a3 #在HTML里调用的方式如下:
# {{ 1|db(2,3)} # 参数 a1 = 1,是第一个参数; a2=2 是第二个参数; a3=3 是第三个参数 if __name__ == '__main__':
app.run()

Flask--请求扩展的更多相关文章

  1. Flask请求扩展和数据库连接池

    1.1.Flask之请求扩展 #!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask, Request, render ...

  2. Flask - 请求扩展,钩子函数(Django的中间件) --> 请求前,中,后,

    例子1. 处理请求之前 @app.before_request 在请求之前,这个被装饰的函数会被执行 用户登录验证代码可以在这里写 @app.before_request def process_re ...

  3. 第二篇 Flask基础篇之(闪现,蓝图,请求扩展,中间件)

    本篇主要内容: 闪现 请求扩展 中间件 蓝图 写装饰器,常用 functools模块,帮助设置函数的元信息 import functools def wrapper(func): @functools ...

  4. Flask 的 请求扩展 与 中间件

    Flask 的 请求扩展 与 中间件 flask 可以通过 扩展(装饰器)来实现类似于django 中间件的功能 类似于django 的中间件, 在执行视图函数之前, 之后的执行某些功能 1 @app ...

  5. Flask的闪现(message) 请求扩展 中间件 蓝图

    补充:一个编程思路 需求:做一些邮件短信微信的消息通知,比如账单告警之类的:比如数据库操作,数据库种类繁多:缓存的选择比如redis/memcache,诸如此类需要进行选择配置,如果我们单纯的用函数去 ...

  6. flask之请求与响应、闪现(阅后即焚)、请求扩展(before,after)、中间件、LOCAL对象、偏函数、

    目录 1.flask请求与响应 2.闪现 3.请求扩展 4.中间件 5.LOCAL对象 6.偏函数 templates 1.flask请求与响应 from flask import Flask,req ...

  7. flask框架(六)——闪现(get_flashed_message)、请求扩展、中间件(了解)

    message -设置:flash('aaa') -取值:get_flashed_message() -假设在a页面操作出错,跳转到b页面,在b页面显示a页面的错误信息 1 如果要用flash就必须设 ...

  8. Flask - 请求响应 | session | 闪现 | 请求扩展 | 中间件

    请求响应 flask的请求信息都在request里 flask的响应方式有四剑客,也可以自定义响应 请求相关信息 # request.method 提交的方法 # request.args get请求 ...

  9. Flask框架(三)—— 请求扩展、中间件、蓝图、session源码分析

    Flask框架(三)—— 请求扩展.中间件.蓝图.session源码分析 目录 请求扩展.中间件.蓝图.session源码分析 一.请求扩展 1.before_request 2.after_requ ...

  10. flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法

    请求钩子: 当我们需要对请求进行预处理和后处理时,就可以用Flask提供的回调函数(钩子),他们可用来注册在请求处理的不同阶段执行的处理函数.这些请求钩子使用装饰器实现,通过程序实例app调用,以 b ...

随机推荐

  1. linux命令-压缩与打包

    在 Linux 中可以识别的常见压缩格式有十几种,比如".zip"" .gz"" .bz2" ".tar" " ...

  2. 前端深入之js篇丨Array数组操作从入门到成神Up Up Up,持续更新中

    写在前面 随着前端深入的不断学习,发现数组这个数据结构在前端中有着相当大的存在感,由于我初学前端的时候并没有系统性的学习数组,所以我将通过这篇文章同你一起学习数组,希望我们能一起进步,学会熟练操作数组 ...

  3. Thinkphp <= 5.0.10 缓存getshell复现

    目录 Thinkphp <= 5.0.10 缓存getshell复现 0x01 poc 0x02 跟踪源码 0x03 审计思路 0x04 补丁 0x05 参考 Thinkphp <= 5. ...

  4. Dynamics CRM邮件附件,你真的了解吗?

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复160或者20151014可方便获取本文,同时可以在第一时间得到我发布的最新的博文信息,follow me! 听人问起怎么读取到一封邮件所有的 ...

  5. Java反射01 : 概念、入门示例、用途及注意事项

    1.Java反射定义 本文转载自:https://blog.csdn.net/hanchao5272/article/details/79360452 官方定义如下: Reflection enabl ...

  6. STL--标准模板库--简要概述

    STL--标准模板库 #include <vector>     //头文件 STL(Standared Template Library)即标准模板库,惠普实验室开发的一系列软件的统称. ...

  7. 036.[转] JNDI 学习

    使用外置服务器(如tomcat)时,如果一个服务器启动多个项目,可以使用JNDI配置数据源,这样每个项目都可以获取到Tomcat 配置的 JNDI的数据源. 在学习 jsp 的时候,作用域对象 pag ...

  8. Saltstack_使用指南12_配置管理-jinja模板

    1. 说明 下文的案例是根据上一篇文章进行的修改.因此请优先读取上一章博文内容<Saltstack_使用指南11_配置管理-状态之间依赖关系> 2. 主机规划 salt 版本 [root@ ...

  9. django之ORM字段及参数

    目录 ORM字段及参数 orm常用字段 字段合集 自定义char字段 字段参数 外键字段的参数 ORM字段及参数 orm常用字段 字段名 说明 AutoField 如果自己没有定义主键id,djang ...

  10. 一个驱动导致的内存泄漏问题的分析过程(meminfo->pmap->slabtop->alloc_calls)

    关键词:sqllite.meminfo.slabinfo.alloc_calls.nand.SUnreclaim等等. 下面记录一个由于驱动导致的内存泄漏问题分析过程. 首先介绍问题背景,在一款嵌入式 ...