啥是钩子函数

钩子函数是指在执行函数和目标函数之间挂载的函数, 框架开发者给调用方提供一个point -挂载点, 至于挂载什么函数有我们调用方决定, 这样大大提高了灵活性

flask常见的钩子函数

  • before_first_request 处理第一次请求之前执行
# 服务器被第一次访问执行的钩子函数
@app.before_first_request
def first_request():
    print("www.h3blog.com")
  • before_request 在每次请求之前执行. 通常使用这个钩子函数预处理一些变量, 视图函数可以更好调用
# 在服务器接收的请求还没分发到视图函数之前执行的钩子函数
@app.before_request
def before_request():
    # print("我勾住了每次请求")
    user_id = session.get("user_id")
    if user_id:
        g.user = "何三"
  • teardown_appcontext 当APP上下文被移除之后执行的函数, 可以进行数据库的提交或者回滚
@app.teardown_appcontext
def teardown(exc=None):
    if exc is None:
        db.session.commit()
    else:
        db.session.rollback()
    db.session.remove()
  • template_filter 增加模板过滤器
@app.template_filter
def upper_filter(s):
    return s.upper()
  • context_processor 上下文处理器, 返回的字典可以在全部模板中使用
@app.context_processor()
def context():
    # 必须返回一个字典
    # hasattr(obj, attr) 判断obj是否有attr属性, 注意此时的attr应该是字符串
    if hasattr(g, "user"):
        return {"current_username": "何三"}
    else:
        # 注意: 必须返回一个字典
        return {}
  • errorhander 在发生一些异常时, 比如404错误, 就会自动调用对应的钩子函数

  • 发生请求错误时, 框架会自动调用相对钩子函数, 并向钩子函数传入error参数

  • 如果钩子函数没有定义error参数, 就会报服务器错误
  • 开发者可以通过flask.abort方法手动抛出异常, 比如发现输入的参数错误可以使用abort(404)来解决
@app.errorhander(404)
def page_not_found(error):
    return render_template("error400.html"), 404

@app.errorhander(500)
def server_error(error):
    return render_template("error505.html"), 500