1. 会话控制

会话控制: cookie 和 session

在flask中会话控制的保存主要通过request和response来完成
session本质上就是保存在服务端中的一个文件,文件中存储了用户的会话信息[我们开发者设置进行的用户登录状态或者访问历史]
session依赖于cookie来实现,因为用户在每次请求服务端时,需要客户端发送属于当前用户的session文件名,一般这个文件名在客户端中使用cookie来保存的,名称一般是session_id

from flask import reuqest # 请求对象 获取cookie信息
from flask import make_response # 响应对象 设置cookie信息

所谓的会话,就是用户和浏览器中网站之间一次交互过程.

会话的开始是在用户打开浏览器以后第一次访问网站.

会话的结束时在用户关闭浏览器以后

因为 http 是一种无状态协议,浏览器请求服务器是无状态的。

无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。

无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。

有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等

实现状态保持主要有两种方式:

  • 在客户端存储信息使用Cookie,本地存储,token[jwt,oauth]

  • 在服务器端存储信息使用Session,redis

1.1 Cookie

Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie的key/value可以由服务器端自己定义。

使用场景: 登录状态, 浏览历史, 网站足迹

Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用

Cookie基于域名安全,不同域名的Cookie是不能互相访问的

如访问luffy.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到luffy.com写的Cookie信息

浏览器的同源策略针对cookie也有限制作用.

当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息

1.1.1 设置cookie

设置cookie需要通过flask的Response响应对象来进行设置,由flask内部提供了一个make_response函数给我们可以快速创建响应对象

from flask import make_response
@app.route("/cookie/set_cookie")
def set_cookie():"""设置cookie"""# return "python"response = make_response("python")  # 这一句代码和上面一句代码是一样response.set_cookie("uid","100",max_age=30,path="/cookie")return response

1.1.2 获取cookie

@app.route("/demo/get_cookie")
def get_cookie():# 获取cookieprint( request.cookies )uid = request.cookies.get("uid","cookie失效了")return uid

1.2 Session

对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息

在服务器端进行状态保持的方案就是Session

注意: Session依赖于Cookie,而且flask中使用session,需要配置SECRET_KEY选项,否则报错.

1.2.1 设置session

from flask import session
@app.route("/set_session")
def set_session():"""设置session"""session["user_name"] = "小灰灰"return "ok"

1.2.2 获取session

@app.route("/get_session")
def get_session():"""获取session"""uname = session.get("user_name","session数据没有了")return uname

2. 请求钩子

在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:

  • 在请求开始时,建立数据库连接;

  • 在请求开始时,根据需求进行权限校验;

  • 在请求结束时,指定数据的交互格式;

为了让每个视图函数避免编写重复功能的代码,Flask提供了通用设置的功能,即请求钩子。

请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子:

  • before_first_request

    • 在处理第一个请求前执行

  • before_request

    • 在每次请求前执行

    • 如果在某修饰的函数中返回了一个响应,视图函数将不再被调用

  • after_request

    • 如果没有抛出错误,在每次请求后执行

    • 接受一个参数:视图函数作出的响应

    • 在此函数中可以对响应值在返回之前做最后一步修改处理

    • 需要将参数中的响应在此参数中进行返回

  • teardown_request:

    • 在每次请求后执行

    • 接受一个参数:错误信息,如果有相关错误抛出

    • 需要设置flask的配置DEBUG=False,teardown_request才会接受到异常对象。

"""请求钩子"""
@app.before_first_request
def before_first():print("项目初始化以后第一次被访问!")@app.before_request
def before_request():print("项目每一次被访问,视图执行之前,都会执行这个钩子!")@app.after_request
def after_request(response):print("项目每一次被访问,视图执行之后,都会执行这个钩子!")return response# 使用这个钩子,是在debug=Flase才有效果
@app.teardown_request
def teardown_request(exc):print("项目每一次被访问,视图执行以后,都会执行这个钩子! 一旦发生错误,会把错误对象传递到当前钩子")print( exc ) # 异常处理对象

代码参考,以下方代码实现为主

from flask import Flask
from settings.dev import DevConfigapp = Flask(__name__)
# 项目配置
app.config.from_object(DevConfig)@app.before_first_request
def before_first_request():print("----before_first_request----")print("系统初始化的时候,执行这个钩子方法")print("会在接收到第一个客户端请求时,执行这里的代码")@app.before_request
def before_request():print("----before_request----")print("每一次接收到客户端请求时,执行这个钩子方法")print("一般可以用来判断权限,或者转换路由参数或者预处理客户端请求的数据")@app.after_request
def after_request(response):print("----after_request----")print("在处理请求以后,执行这个钩子方法")print("一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作")response.headers["Content-Type"] = "application/json"# 必须返回response参数return response@app.teardown_request
def teardown_request(exc):print("----teardown_request----")print("在每一次请求以后,执行这个钩子方法,如果有异常错误,则会传递错误异常对象到当前方法的参数中")print(exc)@app.route("/")
def index():print("----视图函数----")print("视图函数被运行了")return "视图函数被运行了<br>"if __name__ == '__main__':app.run(host="0.0.0.0", port=80)

代码实现

在第1次请求时的打印:

----before_first_request----
系统初始化的时候,执行这个钩子方法
会在接收到第一个客户端请求时,执行这里的代码
----before_request----
每一次接收到客户端请求时,执行这个钩子方法
一般可以用来判断权限,或者转换路由参数或者预处理客户端请求的数据
----视图函数----
视图函数被运行了
----after_request----
在处理请求以后,执行这个钩子方法
一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作
----teardown_request----
在每一次请求以后,执行这个钩子方法,如果有异常错误,则会传递错误异常对象到当前方法的参数中
None

在第2次请求时的打印:

----before_request----
127.0.0.1 - - [08/Apr/2019 09:23:53] "GET / HTTP/1.1" 200 -
每一次接收到客户端请求时,执行这个钩子方法
一般可以用来判断权限,或者转换路由参数或者预处理客户端请求的数据
----视图函数----
视图函数被运行了
----after_request----
在处理请求以后,执行这个钩子方法
一般可以用于记录会员/管理员的操作历史,浏览历史,清理收尾的工作
----teardown_request----
在每一次请求以后,执行这个钩子方法,如果有异常错误,则会传递错误异常对象到当前方法的参数中
None

转载于:https://www.cnblogs.com/yijue-lu/p/10952309.html

三、Flask_会话控制与请求钩子相关推荐

  1. Flask 中的上下文管理和请求钩子

    Flask 中的上下文管理和请求钩子 在使用 Flask 框架实现功能接口的时候,前端点击按钮发送请求的请求方式和 form 表单提交给后端的数据,后端都是通过 Flask 中的 request 对象 ...

  2. UDS知识整理(三):诊断会话控制——0x10服务整理

    目录 一.0x10服务(诊断会话控制)简介 二.0x10服务信息格式 (1)请求格式 (2)正响应格式 (3)负响应格式 三.0x10服务举例 (1)如:请求拓展诊断权限 (2)如:请求安全系统诊断权 ...

  3. 限制会话id服务端不共享_会话控制 - able-woman - 博客园

    会话控制是什么? cookie和session都是跟踪整个会话过程的技术手段.而会话,就是用户通过浏览器和服务器的一次通话. 为什么要有会话控制? 因为HTTP协议是无状态的,服务器不知道用户上一次做 ...

  4. PHP学习总结(会话控制)

    最近刚做完一个简易的登陆注册小项目,当时做的时候匆忙,现在来详细的了解一下PHP会话控制这方面的知识. cookie和seesion技术出现的原因: 当一个用户请求一个页面时,再请求同一个网站上的另外 ...

  5. MQTT协议详解 三、MQTT控制包(CONNECT)

    文章目录 系列文章目录 前言 CONNECT(客户端请求连接服务端) 一.固定包头(2字节) 二.可变包头(10字节) 协议名字(6字节) 协议等级(1字节) 连接标识(1字节) Clean Sess ...

  6. UDS协议-0x10(诊断会话控制)

    UDS诊断协议是一种汽车诊断技术,通过收发车辆ECU的请求信号,即可做出相应的响应. 命令 0x10 (诊断会话控制) Diagnostic Session Control 0x10命令用于确定模式, ...

  7. JavaWeb基础(2):熟悉HTMLCSS、Servlet、JSP、EL、JSTL、会话控制、jQuery、JSON、Filter、Listener

    1.HTML&CSS 网页的组成 结构:HTML 表现:CSS 行为:JavaScript 一个良好的网页要求结构.表现.行为三者分离 HTML中常用的标签 标题标签:一共6个 <h1& ...

  8. UDS诊断系列之五 诊断会话控制(10)服务

    诊断会话控制服务,其服务ID是0x10,主要功能为控制服务端的会话模式的切换. 一.诊断会话模式 诊断会话模式分为默认会话模式和非默认会话模式,不同的会话模式所支持的功能.权限.时间参数等等是不一样的 ...

  9. PHP面试 PHP基础知识 八(会话控制)

    ---恢复内容开始--- PHP会话控制技术 首先了解一下为什么要使用会话控制技术? 本身web 与服务器的交互是通过HTTP协议来实现的,而HTTP协议又是无状态协议.就是说明HTTP协议没有一个內 ...

最新文章

  1. 全球首个开源图像识别系统上线了!人脸、商品、车辆识别一网打尽!
  2. springboot 启动类注解 @SpringBootApplication 和 @ComponentScan 的问题
  3. boost::gil::ImageConcept用法的测试程序
  4. 学习 jQuery下拉框,单选框,多选框整理
  5. 单线程任务 Task.Factory.StartNew 封装
  6. 读书笔记之何时重构(下)
  7. html5表格树,利用ztree实现树形表格
  8. 0514JS练习:函数
  9. python中对象的定义_全面了解python中的类,对象,方法,属性
  10. win8普通版连接远程桌面---RDPWrap
  11. AutoCAD中的Spline曲线算法分析(二)
  12. 谈谈创业这点事(8)
  13. 粒子滤波matlab示例,[转载]粒子滤波Matlab示例
  14. o2o电商模式的创业机会有哪些?
  15. Pandas熊猫框架
  16. OpenXml操作Word的一些操作总结. - 天天不在
  17. [SV]SystemVerilog学习笔记之struct union
  18. 文件缓存FileCache
  19. ioredis.js tutorial
  20. 自媒体资源:分享8个免版权视频素材网站

热门文章

  1. 英国脱欧但网络安全领域重视未减
  2. 十 mybatis逆向工程
  3. 深入理解C++中的mutable关键字 ​
  4. AOP的研究认识了MVC
  5. ASP.NET中Visio图形的控制与数据的动态显示
  6. vt Hypervisor Framework
  7. 浅谈CSS3中display属性的Flex布局,关于登陆页面属性框的设置
  8. javascript中构造函数的返回值问题和new对象的过程
  9. 邬贺铨:5G资费便宜10倍 WiFi覆盖更为重要
  10. socket编程之二:两种链接类型tcp和udp