02.Flask cookie、session与闪现

文章目录

  • 02.Flask cookie、session与闪现
    • 一、储备知识
      • 1.什么是cookie?
      • 注意点:
    • 二、如何在flask中使用cookie?
      • 设置cookie
      • 实例:设置cookie
        • 在浏览器中查看cookie的三种方式(以Chrome浏览器为例)
      • 设置cookie的有效期
        • 基于max_age参数设置cookie有效期
        • 基于expires参数设置cookie有效期
      • 在Flask中查询cookie
      • 删除cookie
    • 二、session
      • 1.什么是session?
      • 2. 实现session的两种思路
      • 3.如何在flask中实现session?
        • 1.设置session
        • 2.设置session有效期
      • 获取session
      • 删除session
    • 三、闪现
      • 在模板中获取闪现信息
        • 简单的在模板中实现获取闪现信息
        • 模板中的分类闪现
        • 模板中过滤闪现消息
      • 在视图中获取闪现信息
        • 简单的在是视图中获取闪现信息
        • 在视图中实现分类获取闪现信息

一、储备知识

1.什么是cookie?

当一个用户访问web服务器后,web服务器会获取用户的状态并且返回一些数据(cookie)给浏览器,浏览器会自动储存这些数据(cookie),当用户再次访问web服务器,浏览器会把cookie放到请求报文中发送给web服务器,web服务器就会获取到了用户的状态。基于这次用户的状态方便用户进行其他业务的访问,并且web服务器可以设置浏览器保存cookie的时间,cookie是有域名的概念,只有访问同一个域名的时候才会把之前相同域名返回的cookie携带给该web服务器。

注意点:

  • web通讯一般基于HTTP协议,HTTP是无状态协议。
  • Cookie技术是用来保持web访问状态,Cookie技术通过在请求和响应报文中添加Cookie数据来保存客户端的状态信息
  • 服务器可以设置cookie的有效期,浏览器会自动清除过期的cookie
  • cookie有域名的概念,只有访问同一个域名,才会把之前相同域名返回的cookie携带给该服务器。
  • cookie:服务端保存在客户端浏览器上的信息都可以称之为cookie,它的表现形式一般都是Key:Value键值对(可以有多个)

二、如何在flask中使用cookie?

设置cookie

设置cookie的时候是由我们web服务器设置,也就是在Flask项目中生成cookie,经由响应报文返回给浏览器保存cookie,下次浏览器再访问web服务器的时会在请求报文中把cookie携带过来,所以cookie产生的起点是在web服务器中,也就是我们的Flask项目中。

在Flask中如果想要在响应中添加一个cookie,最方便的做法是使用内置的Response类提供的set_cookie()方法。

属性 说明
key cookie的键(名称)
value cookie的值
max_age cookie被保存的时间数,单位为秒。
expires 具体的过期时间,一个datetime对象或UNIX时间戳
path 限制cookie只在给定的路径可用,默认为整个域名下路径都可用
domain 设置cookie可用的域名,默认是当前域名,子域名需要利用通配符domain=.当前域名
secure 如果设为True,只有通过HTTPS才可以用
httponly 如果设为True,进制客户端JavaScript获取cookie

实例:设置cookie

app.py

from flask import Flask, Responseapp = Flask(__name__)@app.route('/')
def index():res = Response('设置cookie给浏览器')res.set_cookie('user_name', 'mark')return resif __name__ == '__main__':app.run()

解读 app.py

(1) 首先导入Flask内置的Response类,用于在响应报文中设置cookie

from flask import Flask,request, Response

(2) 在视图函数实例化Response类并传入返回的内容,Response类实例化出的对象调用set_cookie()方 法,set_cookie内的第一个参数是设置cookie的key,第二个参数是用来设置cookie的value,然后返回该对象,就会携带着设置好的cookie返回给浏览器保存。

@app.route('/')
def index():res = Response('设置cookie给浏览器')res.set_cookie('user_name', 'mark')return res

在浏览器中查看cookie的三种方式(以Chrome浏览器为例)

第一种: 右键检查----->Network---->找到访问的域名---->找到Response Headers---->Set-Cookie

第二种:点击url输入框左边的信息icon,然后找到响应的域名,展开查看cookie。

第三种:设置---->高级---->内容设置---->Cookie---->查看所有cookie设置----->根据域名搜索对应的cookie信息

设置cookie的有效期

注意:Flask服务器默认设置cookie有效期为关闭浏览器后cookie失效

基于max_age参数设置cookie有效期

再设置cookie的调用set_cookie()时候传入关键字实参 max_age= 值,这个代表多少秒后过期。

注意:max_age参数设置过期时间不兼容IE8一下的浏览器

@app.route('/')
def hello_world():resp = Response('设置cookie给浏览器')resp.set_cookie('user_name', 'mark',max_age=60)return resp

基于expires参数设置cookie有效期

再设置cookie的调用set_cookie()时候传入关键字实参 expires= 值,这个代具体的过期时间,一个datetime对象或UNIX时间戳。

使用expires参数,就必须会用格林尼治时间(也就是相对北京时间少8个小时,因为浏览器会默认把服务器传来的时间值当做标准格林尼治时间,并根据当地的时区做调整 。

@app.route('/expires_demo/')
def expires_demo():resp = Response('设置cookie给浏览器, cookie设置过期时间为一个月后')expires = datetime.now()+timedelta(days=30, hours=16)resp.set_cookie('user_name', 'mark', expires=expires)return resp

在Flask中查询cookie

查询cookie 是通过请求对象的cookies属性读取,读取的过程是使用设置cookie时的key来读取到设置cookievalue

@app.route('/get_cookie/')
def get_cookie():user_name = request.cookies.get('user_name')if user_name == 'mark':return '{}的信息'.format(user_name)return 'cookie验证失败'

删除cookie

删除cookie是通过Flask内置的Response类实例化出的对象调用delete_cookie('key'),删除的过程是使用设置cookie时的key来删除cookie信息。

@app.route('/del/')
def del_cookie():resp = Response('删除cookie')resp.delete_cookie('user_name')return resp

二、session

1.什么是session?

session的基本概念:session又称之为安全的cookie,它是基于cookie来实现的,session是一个思路、是一个概念、一个服务器存储授权信息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现,session的目的和cookie完全一致,cookie在客户端和服务端处理的非常粗糙,cookie在浏览器保存的时候以及传输的过程均使用明文,导致了很多安全隐患问题,session的出现就是为了解决cookie存储数据不安全的问题。

注意:session是一个思路一个概念,session的实现是基于cookie的,session并不像cookie是一项真实存在的技术,可以简单的理解为把粗糙的cookie在服务端通过加密,永久化等方式提高cookie的安全级别。

2. 实现session的两种思路

第一种

  1. 客户端携带用户信息请求服务端验证。
  2. 服务端验证成功后生成随机的session_id与用户信息建立映射后存储到数据库中(注意:数据库可以是任意永久化保存数据的机制,如redis、memcached、mysql、甚至是文件等等)。
  3. 服务端把刚刚生成的session_id作为cookie信息返回给客户端。
  4. 客户端收到以session_id为内容的cookie信息保存到本地。
  5. 客户端再次请求的时候会携带以session_id为内容的cookie去访问服务端,服务端取出session_id去数据库校验得到用户信息。

第二种

  1. 客户端携带用户信息请求服务端验证。
  2. 服务端收到用户信息验证成功后,服务端再把用户信息经过严格的加密加盐生成session信息。并且把刚刚生成的session信息作为cookie的内容返回给客户端。
  3. 客户端收到以session信息为内容的cookie保存到本地。
  4. 客户端再次请求的时候会携带以session信息为内容的cookie去访问服务端,服务端取出session信息经过解密得到用户的信息。

注意:flask使用的就是第二种思路,利用加密解密的方式实现session,实现安全的cookie,服务端并不会做永久化的储存。

3.如何在flask中实现session?

1.设置session

Flask提供了session对象用来将cookie加密储存,session通过秘钥对数据进行签名以加密数据。

from flask import Flask, session
import osapp = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24) # 配置session使用的秘钥@app.route('/')
def set_session_info():session['username'] = 'mark' # 使用用户信息配置sesion信息作为cookie,并添加到响应体中return '设置session信息'

解读

通过app对象 通过SECRET_KEY配置session使用的加密秘钥

app.config['SECRET_KEY'] = os.urandom(24) # 配置session使用的秘钥

session对象像可以字典一样操作,内部是把字典的信息进行加密操作然后添加到相应体中作为cookie,响应的时候会自动返回给浏览器。

 session['username'] = 'mark'session['userphone'] = '123456'  # 可以指定多条session信息,统一放到响应的cookie中返回给浏览器

2.设置session有效期

后端Flask跟浏览器交互默认情况下,session cookie会在用户关闭浏览器时清除。通过将session.permanent属性设为True可以将session的有效期延长为31天,也可以通过操作app的配置PERMANENT_SESSION_LIFETIME来设置session过期时间。

案例 :开启指定session过期时间模式

from flask import Flask, session
import osapp = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)@app.route('/')
def set_session_info():session['username'] = 'mark'session['userphone'] = '123456'session.permanent = True # 开启设置有效期,默认为31天后过期return 'Hello World!'
...

案例 :开启session指定过期时间模式后指定具体的过期时间

通过设置PERMANENT_SESSION_LIFETIME指定具体的过期时间

from datetime import timedelta
app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=1) # 设置为1小时候过期

获取session

在Flask中获取设置的session信息通过session对象获取,session对象是继承了字典类,所以获取的时候是字典的取值方式。其内部会把浏览器传过来的session信息解密。

@app.route('/get_session/')
def get_session():username = session.get('username')userphone = session.get('userphone')if username or userphone:return "{},{}".format(username, userphone)return "session为空"

删除session

session对象调用pop()可以根据具体的session的key清除掉指定的session信息。

session对象调用clear()可以清除此次请求的浏览器关于本域名的所有session信息

@app.route('/del_session/')
def del_session():session.pop('username')# session.clear()return '删除成功'

三、闪现

在模板中获取闪现信息

Flask 提供了一个非常简单的方法来使用闪现系统向用户反馈信息。闪现系统使得在一个请求结束的时候记录一个信息,然后在且仅仅在下一个请求中访问这个数据,强调flask闪现是基于flask内置的session的,利用浏览器的session缓存闪现信息。所以必须设置secret_key

简单的在模板中实现获取闪现信息

app.py

from flask import Flask, flash, redirect, render_template, \request, url_forapp = Flask(__name__)
app.secret_key = 'some_secret'@app.route('/')
def index():return render_template('index.html')@app.route('/login', methods=['GET', 'POST'])
def login():error = Noneif request.method == 'POST':if request.form['username'] != 'admin' or \request.form['password'] != '123':error = '登录失败'else:flash('恭喜您登录成功')return redirect(url_for('index'))return render_template('login.html', error=error)if __name__ == "__main__":app.run()

注意:这个 flash() 就可以实现在下一次请求时候,将括号内的信息做一个缓存。不要忘记设置secret_key

这里是 index.html 模板:

{% with messages = get_flashed_messages() %}  # 获取所有的闪现信息返回一个列表{% if messages %}<ul class=flashes>{% for message in messages %}<li>{{ message }}</li>{% endfor %}</ul>{% endif %}
{% endwith %}<h1>主页</h1><p>跳转到登录页面<a href="{{ url_for('login') }}">登录?</a>

注意:{% with messages = get_flashed_messages() %} # 获取所有的闪现信息返回一个列表

这里是login.html 模板

<h1>登录页面</h1>
{% if error %}
<p class=error><strong>Error:</strong> {{ error }}
{% endif %}<form action="" method=post>用户名:<input type=text name=username>密码:<input type=password name=password><p><input type=submit value=Login></p>
</form>

简单的在模板中实现获取闪现信息小结:

设置闪现内容:flash('恭喜您登录成功')
模板取出闪现内容:{% with messages = get_flashed_messages() %}

模板中的分类闪现

当闪现一个消息时,是可以提供一个分类的。未指定分类时默认的分类为 'message' 。 可以使用分类来提供给用户更好的反馈,可以给用户更精准的提示信息体验。

要使用一个自定义的分类,只要使用 flash() 函数的第二个参数:

flash('恭喜您登录成功',"status")
flash('您的账户名为admin',"username")

在使用get_flashed_messages()时候需要传入with_categories=true便可以渲染出来类别

{% with messages = get_flashed_messages(with_categories=true) %}{% if messages %}<ul class=flashes>{% for category, message in messages %}<li class="{{ category }}">{{ category }}:{{ message }}</li>{% endfor %}</ul>{% endif %}
{% endwith %}

模板中的分类闪现小结:

分类设置闪现内容:flash('恭喜您登录成功',"status")flash('您的账户名为admin',"username")
模板取值:   {% with messages = get_flashed_messages(with_categories=true) %}{% if messages %}<ul class=flashes>{% for category, message in messages %}...

模板中过滤闪现消息

同样要使用一个自定义的分类,只要使用 flash() 函数的第二个参数:

flash('恭喜您登录成功',"status")
flash('您的账户名为admin',"username")

在使用get_flashed_messages()时候需要传入category_filter=["username"]便可根据类别取出闪现信息。中括号内可以传入的值就是类别,可以传入多个。

{% with messages = get_flashed_messages(category_filter=["username"]) %}
{% if messages %}<ul>{%- for message in messages %}<li>{{ message }}</li>{% endfor -%}</ul>
</div>
{% endif %}
{% endwith %}

小结:

分类设置闪现内容:flash('恭喜您登录成功',"status")flash('您的账户名为admin',"username")
模板取值:  % with messages = get_flashed_messages(category_filter=["username"]) %}{% if messages %}<ul>{%- for message in messages %}

在视图中获取闪现信息

简单的在是视图中获取闪现信息

-设置: flash('xxx')
-取值:get_flashed_message() # 注意这个不同于模板取值,这个是从flask中导入的
-注意:在视图中获取闪现信息不必非得是两次连续的请求,只要保证是第一次取相应的闪现信息,就可以取得到。

实例:

from flask import Flask, request, flash, get_flashed_messages
import osapp = Flask(__name__)
app.secret_key = os.urandom(4)
app.debug = True@app.route('/login/')
def login():if request.args.get('name') == 'rocky':return 'ok'flash('第一条闪现信息:用户名不是rocky填写的是{}'.format(request.args.get('name')))# flash('第二条闪现信息:用户名不是rocky填写的是{}'.format(request.args.get('name')))return 'error,设置了闪现'
@app.route('/get_flash/')
def get_flash():#get_flashed_messages()是一个列表列表可以取出闪现信息,该条闪现信息只要被取出就会删除掉。return '闪现的信息是{}'.format(get_flashed_messages())@app.route('/demo/')
def demo():return 'demo'if __name__ == '__main__':app.run()

**(1)**会触发设置闪现内容

**(2)**取出闪现内容

**(3)**再次取出闪现内容,发现闪现内容取出一次后就为空了

小结:

  • 可以设置多多个信息
  • get_flashed_messages()是一个列表,该列表默认可以取出闪现信息,该条闪现信息只要被取出就会删除掉。
  • 闪现只能在当前路径下取一次

在视图中实现分类获取闪现信息

-设置:flash('用户名错误', "username_error")flash('用户密码错误', "password_error") # 第二个参数为闪现信息的分类。-取所有闪现信息的类别和闪现内容:get_flashed_messages(with_categories=True)-针对分类过滤取值:get_flashed_messages(category_filter=['username_error']) # 中括号内可以写多个分类。-注意:如果flash()没有传入第二个参数进行分类,默认分类是 'message'

实例1

@app.route('/login/')
def login():if request.args.get('name') == 'rocky':return 'ok'flash('用户名错误', category="username_error")flash('用户密码错误', "password_error")return 'error,设置了闪现'
@app.route('/get_flash/')
def get_flash():return '闪现的信息是{}'.format(get_flashed_messages(with_categories=True))

把所有的闪现类别和闪现信息返回。

实例2

@app.route('/login/')
def login():if request.args.get('name') == 'rocky':return 'ok'flash('用户名错误', category="username_error")flash('用户密码错误', "password_error")return 'error,设置了闪现'
@app.route('/get_flash/')
def get_flash():return '闪现的信息是{}'.format(get_flashed_messages(category_filter=['username_error']))

返回页面只显示了 "username_error"的分类内容

Flask cookie、session与闪现相关推荐

  1. Flask之cookie、session、闪现

    文章目录 Flask之cookie.session.闪现 一.cookie 1.1 什么是cookie? 1.2 如何在flask中使用cookie? 1.2.1 设置cookie 1.2.1.2 实 ...

  2. python客户端修改session_python中flask的Session设置的方法介绍

    本篇文章给大家带来的内容是关于python中flask的Session设置的方法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 什么是Session? cookie: 客户端浏览 ...

  3. Flask的session使用

    由于http是无状态保存的协议,session可以看作不同请求之间保存数据的一种机制.flask的session是基于cookie的会话保持. 流程 当客户端进行第一次请求的时候,客户端的HTTP r ...

  4. Flask框架flash消息闪现学习与优化符合闪现之名

    Flask的flash 第一次知道Flask有flash这个功能时,听这名字就觉得高端,消息闪现-是跳刀blink闪烁躲技能的top10操作吗?可结果让我好失望,哪里有什么闪现的效果,不过是平常的消息 ...

  5. Flask cookie

    1.为什么要用cookie? http请求是无状态的.既每次打开一个网页(请求和回复)都是独立的.第二次打开网页不会记录第一次打开网页的信息. 如果没有cookie,我们就无法记录登录信息,那么用户每 ...

  6. 【python】Flask之session使用

    一.session机制 1.1 session的作用 由于http协议是一个无状态的协议,但网站基本上有登录使用的功能,这要求有状态管理,而session机制实现的就是这个功能 session基于co ...

  7. Flask之session伪造

    前言 本文结合CTF中遇到的题目来说一下session伪造,虽然已经有很多师傅写了,而且写的都特别好,但是还是想自己记录一下,也方便以后复习.ciscn中就有一个session伪造的题,由于之前没有做 ...

  8. 彻底理解cookie,session,localStorage(附代码)

    2019独角兽企业重金招聘Python工程师标准>>> 1. cookie 1.1 什么是cookie cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某 ...

  9. 2、cookie session token详解

    cookie session token详解 转自:http://www.cnblogs.com/moyand/ 发展史 1.很久很久以前,Web 基本上就是文档的浏览而已, 既然是浏览,作为服务器, ...

最新文章

  1. 阿里终面:为什么SSD不能当做内存用?
  2. 比特币现金是世界上最好货币的十大理由
  3. initializeBean()方法为容器产生的Bean 实例对象添加BeanPostProcessor 后置处理器
  4. Java 8:声明接口中的私有方法和受保护的方法
  5. python往redis导数_Python:教你一招,将500W+的数据快速写入redis(文内赋赠教程)...
  6. pytorch torch.eye
  7. AD批量修改电阻封装记得按CTRL+A
  8. 饮食与癌细胞代谢的分子联系
  9. linux下磁盘占用达到100%了,找不到哪些大文件耗尽了磁盘。
  10. 瀚高数据库安全配置要求
  11. dango models and database ---- verbose name
  12. 搞一下TDA4 | 03 TDA4 辅助引导加载程序SBL
  13. (九)统计学习方法 | 隐马尔可夫模型
  14. 罗彻斯特大学计算机科学系专业排名,罗切斯特大学优势专业及优势专业排名(USNEWS美国大学排名)...
  15. 如何用DirectShow替代付费的摄像头SDK
  16. 计算机一级上机考试证书,大学生考证不要盲目跟风,这几个证书”含金量低“,不值得考...
  17. 新手上路有哪些开车技巧 , 很实用!
  18. thinkphp5图片或者视频上传
  19. 林达华推荐的几本数学书
  20. 配置和安装PIA过程中的常见问题

热门文章

  1. 【不得不看的几种js监听浏览器返回,关闭,刷新】
  2. Spring Web
  3. Java——员工的重要性
  4. 人人悦--人人悦系统开发源码分享
  5. 小数为何叫成浮点数 ?
  6. 机器学习 数据的采集和清洗
  7. 自动访问QQ空间(亮点是程序的美化)
  8. 来都来了,确定不白嫖吗?!
  9. 想进某电商公司?建议学会电商 sku 的全排列算法!
  10. 植物大战僵尸阳光修改之美