Flask--请求扩展

请求扩展

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()
原文地址:https://www.cnblogs.com/Hades123/p/11781182.html