• flask基础3-蓝图-cookie-钩函数-flask上下文-异常处理


    目录

    一:蓝图

    1.蓝图介绍

    2.使用步骤

    3.蓝图中的静态资源和模板

    二.cookie和session

    1.cookie

    2.flask中操作cookie

    3.session

    4.session操作步骤

    三.请求钩子

     四.flask上下文

    1.介绍

    2.请求上下文:

    3.应用上下文

    3.g对象

    五:异常处理

    1.abort方法

    2.捕获异常


     

    flask基础1

     flask基础2

    一:蓝图

    1.蓝图介绍

    Flask中,使用蓝图Blueprint来分模块组织管理。 蓝图实际可以理解为是一个存储一组视图方法的容器对象,其具有如下特点:

    一个应用可以具有多个Blueprint

    可以将一个Blueprint注册到任何一个未使用的URL下比如 “/user”、“/goods”

    Blueprint可以单独具有自己的模板、静态文件或者其它的通用操作方法,它并不是必须要实现应用的视图和 函数的

    在一个应用初始化时,就应该要注册需要使用的Blueprint

    但是一个Blueprint并不是一个完整的应用,它不能独立于应用运行,而必须要注册到某一个应用中。

    2.使用步骤

    1.创建一个蓝图对象

    user_bp=Blueprint('user',__name__)

    2.在这个蓝图上注册路由,指定静态文件,注册模板过滤器

    1. @user_bp.route('/')
    2. def user_info():
    3. return 'user_info模块'

    3.在应用对象上注册这个蓝图对象

    app.register_blueprint(user_bp)
    

    总的来说蓝图是为了防止一个py文件中写了很多路由,不方便管理,所有我们要对这个应用进行模块化,而蓝图正好可以解决这一点

    3.蓝图中的静态资源和模板

    1.url前缀

    指定蓝图中定义的url前缀,在应用中注册的时候使用url_prefix参数指定,加上这个以后再访问这个蓝图中的url的时候要加上这个前缀

    app.regist_blueprint(user_bp,url_prefix='/user')

    2.蓝图中的静态资源

    再应用中,应用会自动去找项目中默认的静态资源static,而蓝图不同,蓝图对象再创建的时候不会默认注册静态目录的路由,需要我们再创建时指定static_folder参数。

    user_info=Blueprint('user',__name__,static_folder='static_user')
    

    3.蓝图中的模板

    蓝图对象默认的模板目录为系统的模版目录,可以在创建蓝图对象时使用 template_folder 关键字参数设置模板目录

    user_info=Blueprint('user',__name__,template_folder='user_templates')

    二.cookie和session

    1.cookie

    Cookie是一段不超过4KB的小型文本数据,保存在客户端浏览器中,由一个名称(Name)、一个值(Value)和 其它几个用于控制Cookie有效期、安全性、使用范围的可选属性组成。其中 :

    (1) Name/Value:设置Cookie的名称及相对应的值,对于认证Cookie,Value值包括Web服务器所提供的访问令 牌。

    (2) Expires属性:设置Cookie的生存期。有两种存储类型的Cookie:会话性与持久性。Expires属性缺省时,为会 话性Cookie,仅保存在客户端内存中,并在用户关闭浏览器时失效;持久性Cookie会保存在用户的硬盘中,直至 生存期到或用户直接在网页中单击“注销”等按钮结束会话时才会失效 。

    (3) Path属性:定义了Web站点上可以访问该Cookie的目录 。

    (4) Domain属性:指定了可以访问该 Cookie 的 Web 站点或域。

    2.flask中操作cookie

    1. from flask import Flask
    2. from flask import make_response
    3. app=Flask(__name__)
    4. @app.route('/cookie')
    5. def set_cookie():
    6. resp=make_response('hello zhangsan')
    7. # 参数:第一个就是cookie中的一个名称,第二个是值,第三哥关键字代表生存期为3600秒
    8. resp.set_cookie('username','zhangsan',max_age=3600)
    9. return resp
    10. if __name__ == '__main__':
    11. # 运行这个应用后访问/cookie这个地址就后生成一个cookie信息
    12. app.run(debug=True)

     读取cookie和删除cookie

    1. from flask import Flask, request
    2. from flask import make_response
    3. app=Flask(__name__)
    4. @app.route('/cookie')
    5. def set_cookie():
    6. resp=make_response('hello zhangsan')
    7. # 参数:第一个就是cookie中一个值的键,第二个是值,第三哥关键字代表生存期为3600秒
    8. resp.set_cookie('username','zhangsan',max_age=3600)
    9. return resp
    10. # 获得cookie
    11. @app.route('/get_cookie')
    12. def get_cookie():
    13. # 先使用上面那个路由访问/cookie后设置好cookie
    14. # 在访问这个地址/get_cookie就可以得到cookie了
    15. resp=request.cookies.get('username')
    16. return resp
    17. # 删除cookie
    18. @app.route('/delete_cookie')
    19. def delete_cookie():
    20. # 先使用上面那个路由访问/cookie后设置好cookie
    21. # 在访问这个/delete_cookie就可以将前面设置的cookie删除
    22. resp=make_response('hello zhangsan')
    23. resp.delete_cookie('username')
    24. return resp
    25. if __name__ == '__main__':
    26. # 运行这个应用后访问/cookie这个地址就后生成一个cookie信息
    27. app.run(debug=True)

    3.session

    Session:与cookie功能效果相同。Session与Cookie的区别在于Session是记录在服务端的,而Cookie是记录在客 户端的。

    当访问服务器某个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟 浏览器关联在一起的。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个 session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录 session的话,就会再启一个属于自己的session。

     session与cookie的联动

    当客户端进行第一次请求时,客户端的HTTP request(cookie为空)到服务端,服务端创建session,视图函数根 据form表单填写session,请求结束时,session内容填写入response的cookie中并返回给客户端,客户端的 cookie中便保存了用户的数据。

    当同一客户端再次请求时, 客户端的HTTP request中cookie已经携带数据,此时cookies不为空, 获取cookie的有 效时长,如果cookie依然有效,通过与写入时同样的签名算法将cookie中的值解密出来,若cookie已经失效,则返 回空。 再根据解密出来的内容判断服务器中是否存在对应的值。

    注意:在Flask中Session的签名算法是:HMAC 和 SHA1算法

    4.session操作步骤

    需要先设置密钥SECRET_KEY(自己定义的,flask内部会自己加密)

    1. from flask import Flask,session
    2. app=Flask(__name__)
    3. # 设置密钥
    4. class DefaultPas(object):
    5. SECRET_KEY='zhangsan is a fawaikuangtu'
    6. app.config.from_object(DefaultPas)
    7. @app.route('/set_session')
    8. def set_session():
    9. session['username']='zhangsan'
    10. return '设置成功'
    11. # 读取session
    12. @app.route('/get_session')
    13. def get_session():
    14. username=session.get('username')
    15. return username

    三.请求钩子

    钩子就是钩子函数,在flask中使用装饰器实现,这些装饰器会在某一次请求的各个阶段启动,请求之前,请求之后等等。

    before_first_request:在处理第一个请求前执行(比如数据库连接是否正常)(新版本flask已经移除)

    before_request:每一次请求前执行(比如有没有这个请求的权力)

    after_request:如果没有抛出错误,在每次请求后执行 接受一个参数:视图函数作出的响应 在此函数中可以对响应值在返回之前做最后一步修改处理 需要将参数中的响应在此参数中进行返回

    teardown_request: 在每次请求后执行 接受一个参数:错误信息,如果有相关错误抛出

    1. from flask import Flask,abort
    2. app=Flask(__name__)
    3. # 这个方法flask新版本中已经移除
    4. # # 在第一次之前调用
    5. # @app.before_first_request
    6. # def before_first_request():
    7. # print("准备执行第一次请求了")
    8. # 在每一次请求之前调用,这时候已经有请求了,可能在这个方法里面做请求的校验
    9. # 如果请求的校验不成功,可以直接在此方法中进行响应,直接return之后那么就不会执行视图函数
    10. @app.before_request
    11. def before_request():
    12. print('每一次请求之前')
    13. # if '这一次请求的权限不够'
    14. # return '滚一边去'
    15. # 在执行完视图函数之后会调用,并且会把视图函数所生成的响应传入,可以在此方法中对响应做最后一步统一的处理
    16. @app.after_request
    17. def after_request(response):
    18. print('这个视图函数已经执行完拉')
    19. return response
    20. # 请每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
    21. @app.teardown_request
    22. def teardown_request(response):
    23. print("本次服务结束")
    24. @app.route('/')
    25. def index():
    26. return 'index'
    27. if __name__ == '__main__':
    28. app.run(debug=True)
    1. 127.0.0.1 - - [13/Jun/2024 13:42:55] "GET / HTTP/1.1" 200 -
    2. 每一次请求之前
    3. 这个视图函数已经执行完拉
    4. 本次服务结束
    5. 每一次请求之前
    6. 这个视图函数已经执行完拉
    7. 本次服务结束
    8. 127.0.0.1 - - [13/Jun/2024 13:42:55] "GET / HTTP/1.1" 200 -

     四.flask上下文

    1.介绍

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

    Flask中有两种上下文,请求上下文和应用上下文

    Flask中上下文对象:相当于一个容器,保存了 Flask 程序运行过程中的一些信息。

    2.请求上下文:

    在两个文件中,我们如何获取另外一个文件中的请求方式,请求地址,cookie呢?

    在flask中,可以直接在视图函数中使用request这个对象进行获取相关数据,而request就是请求上下文的对象,保存了当前本次请求的相关数据,请求上下文对象有:request,session

    request:封装了HTTP请求的内容,针对的是http请求,比如user=request.get('user')

    session:用来记录请求会话中的信息,针对的是用户信息,比如session['name']=user.id可以记录用户信息,还可以通过session.get('name')获取用户信息

    3.应用上下文

    它的字面意思是 应用上下文,但它不是一直存在的,它只是request context 中的一个对 app 的代理(人),所谓 local proxy。它的作用主要是帮助 request 获取当前的应用,它是伴 request 而生,随 request 而灭的。

    应用上下文对象有:current_app,g

    current_app:应用程序上下文,用于存储应用程序中的变量,可以通过current_app.name打印当前的app名称,也可以在current_app中存储一些变量

    应用的启动脚本是哪个文件,启动时指定了哪些参数

    加载了哪些配置文件,导入了哪些配置

    连了哪个数据库

    有哪些public的工具类、常量

    应用跑再哪个机器上,IP多少,内存多大

    current_app就是当前运行的flask app,在代码不方便直接操作flask的app对象时,可以操作current_app就等价于操作flask app对象

    3.g对象

    g作为flask中程序全局的一个临时存储变量,充当中间媒介的作用,我们可通过他对两个文件之间的变量进行传递

    1. from flask import Flask,g
    2. app=Flask(__name__)
    3. def db_query():
    4. user_id=g.user_id
    5. user_name=g.user_name
    6. print(user_name,user_id)
    7. @app.route('/')
    8. def get_user():
    9. g.user_id=123
    10. g.user_name='zhangsan'
    11. db_query()
    12. return '可看到函数db_query中打印的就是我们这里定义的'

    五:异常处理

    1.abort方法

    它可以抛出一个给定状态码的HTTPException或者指定响应,例如想要用一个页面未找到异常来终止请求,你可以调用abort(404)

    abort(404)

    2.捕获异常

     errorhandler 装饰器 :注册一个错误处理程序,当程序抛出指定错误状态码的时候,就会调用该装饰器所装饰的方法

    参数: code_or_exception – HTTP的错误状态码或指定异常

    1. @app.errorhandler(500)
    2. def go_where(e):
    3. return '这个服务器已经搬去别的地方了'

    捕获指定异常:

    1. @app.errorhandler(ZeroDivisionError)
    2. def zero_division_error(e):
    3. return '除数不能为0'

    都看到这里,点个赞在走呗!!!

  • 相关阅读:
    VUE3 + Django 接口请求每次都产生新的session_id,应该如何解决?
    在 Navicat 中执行数据库范围搜索
    前缀树的实现
    pathon数据类型的测试用例
    3.1-分类-概率生成模型
    SpringCloud解决feign调用token丢失问题
    SPN的相关利用
    【Windows】VMware虚拟机安装Windows 10 教程
    OpenCV的简单抠图尝试(白色背景的图片)
    超详细的PHP入门知识点讲解
  • 原文地址:https://blog.csdn.net/m0_73426548/article/details/139650878