3.状态保持,异常处理,钩子函数

状态保持,异常处理,钩子函数

状态保持
  • session 和 cookie

    • 存放位置 cookie 存在客户端 session 服务端
    • 保存大小 cookie 大小限制在 4096 字节 session 取决硬件
    • 安全性 cookie 相对来说不安全 session 相对来说是安全的
  • Cookie实现方式

    # 设置 cookie
    resp = make_response('自定义的响应字符串')
    resp.set_cookie("键","值",max_age=60)
    
    # 获取cookie
    request.cookies.get("键")
    
  • Session实现方式

    # 导包
    from flask import session
    # 设置session
    session['键'] = '值'
    # 获取session
    session.get("键") or session["键"]
    
钩子函数 hooks

钩子函数是指在执行函数和目标函数之间挂载的函数,框架开发者给调用方提供一个point-挂载点,至于挂载什么函数由调用方决定,大大提供了灵活性。
请添加图片描述

  • @app.before_first_request

    在对应用程序实例的第一个请求之前注册要运行的函数,只会运行一次

    @app.before_first_request
    def before_first_request_view():
        print("只执行一次")
    
  • @app.before_request

    在每个请求之前注册一个要运行的函数,每一次请求都会执行一次。

    @app.before_request
    def before_request_view():
        print("每次请求都执行")
    
  • @app.teardown_request

    注册在每一个请求的末尾,不管是否有异常,每次请求的最后都会执行。

    场景: 关闭数据库的连接 打开文件open 最终关闭

    @app.teardown_request
    def teardown_request_view(e):
        print("不管有没有错误 都会执行")
    
  • @app.errorhandler(400)

    发生一些异常时,比如404,500,或者抛出异常(Exception)之类的,就会自动调用该钩子函数
    1.发生请求错误时,框架会自动调用相应的钩子函数,并向钩子函数中传入error参数
    2.如果钩子函数没有定义error参数,就会报错
    3.可以使用abort函数来手动终止请求抛出异常,如果要是发生参数错误,可以abort(404)之类的

    @app.errorhandler(500)
    def handle_errorhandler(e):
        print(e)
        return {"code":1002,"msg":"服务器内部错误","data":{}}, 500
    
异常处理
  • abort 主动抛出异常

    abort(状态码)
    
  • 异常处理函数

    @app.errorhandler(500)
    def handle_errorhandler(e):
        print(e)
        return {"code":1002,"msg":"服务器内部错误","data":{}}, 500
    
flask 上下文
  • 定义

    上下文:即语境,语意,在程序中可以理解为在代码执行到某个时刻,根据之前代码锁做的操作以及下文即将要执行的逻辑,可以决定在当前时刻下可以使用到的变量,或者可以做的事情。

  • flask 中的上下文

    请求上下文(request context)应用上下文(application context)。

  • 上下文图解

请添加图片描述

  • Flask上下文对象分类

    • 请求上下文
    • request
      • session
      • cookie
    • 应用上下文:
    • current_app
      • g对象
  • 上下文怎么使用

    # 手动开启上下文
    在flask程序未运行的情况下, 调试代码或进行测试, 同样需要使用current_app, g, request这些对象, 但程序未运行, 所以无法使用, 此时需要手动开启上下文.
    
    # app_context
    app_context为我们提供了应用上下文环境, 允许我们在外部使用应用上下文current_app, g. 可以通过with语句进行使用:
    >>> from flask import Flask
    >>> app = Flask('')
    >>> app.redis_cli = 'redis client'
    
    >>> from flask import current_app
    >>> current_app.redis_cli   # 错误,没有上下文环境
      报错
    >>> with app.app_context():  # 借助with语句使用app_context创建应用上下文
      ...     print(current_app.redis_cli)
      ...
      redis client
    

    request_context

request_context为我们提供了请求上下文环境,允许我们在外部使用请求上下文request、session可以通过with语句进行使用。

from flask import Flask
app = Flask('')
request.args  # 错误,没有上下文环境
  报错
environ = {'wsgi.version':(1,0), 'wsgi.input': '', 'REQUEST_METHOD': 'GET', 'PATH_INFO': '/', 'SERVER_NAME': 'itcast server', 'wsgi.url_scheme': 'http', 'SERVER_PORT': '80'}  # 模拟解析客户端请求之后的wsgi字典数据
with app.request_context(environ):  # 借助with语句使用request_context创建请求上下文
  ...     print(request.path)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

(initial)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值