当前位置:   article > 正文

flask教程6:cookie和session_flask session

flask session


一、cookie

1.1 什么是cookie?

      一般web通信是基于HTTP的,HTTP是无状态的协议,也就是说,在一次请求响应结束后,服务器不会留下任何有关于对方状态信息,所以需要保持web浏览器的状态。
      比如:对于有些web应用来说,客户端的某些信息必须被记住。比如用户登录过后跳转页面依然要保持登录的状态,进行其他的业务访问,而当这个登录过的用户再次访问web服务器的时候,web服务器并不知道这个用户已经登录过了,所以无法进行其他需要权限的业务访问。所以cookie技术的出现就是为了解决这个问题。

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

1.2 使用cookie

1.2.1 设置cookie

      设置cookie的时候是由我们web服务器设置,也就是在Flask项目中生成cookie,经由响应报文返回给浏览器保存cookie,下次浏览器再访问web服务器的时会在请求报文中把cookie携带过来,所以cookie产生的起点是在web服务器中,也就是我们的Flask项目中。
      在Flask中如果想要在响应中添加一个cookie,最方便的做法是使用内置的Response类提供的==set_cookie()==方法。
set_cookie()方法的参数

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

项目目录

│  app.py
│
├─static    # 文件夹
└─templates # 文件夹

  • 1
  • 2
  • 3
  • 4
  • 5

app.py

from flask import Flask, Response

app = Flask(__name__)


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

    return resp

if __name__ == '__main__':
    app.run()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

from flask import Flask,request, Response

  • 1
  • 2

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

app = Flask(__name__)
@app.route('/')
def hello_world():
    resp = Response('设置cookie给浏览器')
    resp.set_cookie('user_name', 'yudengwu')

    return resp
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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

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

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

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

1.2.2设置cookie的有效期

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

  • 基于max_age参数设置cookie有效期

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

from flask import Flask, Response

app = Flask(__name__)


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

    return resp

if __name__ == '__main__':
    app.run()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 基于expires参数设置cookie有效期

      再设置cookie的调用set_cookie()时候传入关键字实参 expires= 值,这个值代具体的过期时间,一个datetime对象或UNIX时间戳。
      使用expires参数,就必须会用格林尼治时间(也就是相对北京时间少8个小时,因为浏览器会默认把服务器传来的时间值当做标准格林尼治时间,并根据当地的时区做调整 。

from flask import Flask, Response
import datetime
import time
app = Flask(__name__)


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


if __name__ == '__main__':
    app.run()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

1.2.3在Flask中查询cookie

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

from flask import Flask, Response,request
import datetime
import time
app = Flask(__name__)


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

@app.route('/get_cookie/')
def get_cookie():
    user_name = request.cookies.get('user_name')
    if user_name == 'yudengwu':
        return '{}的信息'.format(user_name)

    return 'cookie验证失败'

if __name__ == '__main__':
    app.run()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

1.2.4删除cookie

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

from flask import Flask, Response,request
import datetime
import time
app = Flask(__name__)


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

@app.route('/get_cookie/')
def get_cookie():
    user_name = request.cookies.get('user_name')
    if user_name == 'yudengwu':
        return '{}的信息'.format(user_name)

    return 'cookie验证失败'

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


if __name__ == '__main__':
    app.run()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

二、session

      session:session和cookie的作用有点类似,都是为了存储用户相关的数据。不同的是,cookie存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但是存储在服务器上会占用服务器资源。与cookie不同的是,session是一个思路,一个概念,一个服务器存储授权信息的解决方案。不同的服务器,不同的框架,不同的语言有不同的实现。虽然实现方案不一样,但是他们的目的都是服务器为了方便存储数据的。session的出现,是为了解决cookie存储信息不安全的问题。

      session还可以存储到客户端。客户端发送验证信息之后,服务器把相关的验证信息进行加密,然后将加密后的数据存储到cookie中,返回给浏览器,以后浏览器在请求服务器的时候,会自动将机密的session信息发送给服务端。服务端对数据进行解密之后,在进行验证。flask中使用的就是这种机制。

2.1实现session的两种思路

2.1.1 第一种

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

2.1.2 第二种

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

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

2.2使用session

2.2 .1设置session

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

from flask import Flask, session,Response
import os

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


@app.route('/')
def set_session_info():
    resp = Response('前端')
    session['username'] = 'mark'
    session['userphone'] = '123456'  # 可以指定多条session信息,统一放到响应的cookie中返回给浏览器

    return resp


if __name__ == '__main__':
    app.run()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2.2.2 设置有效期

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

from flask import Flask, session,Response
import os

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


@app.route('/')
def set_session_info():
    resp = Response('前端')
    session['username'] = 'yudengwu'
    session['userphone'] = 'yudengwu'  # 可以指定多条session信息,统一放到响应的cookie中返回给浏览器
    session.permanent = True  # 开启设置有效期,默认为31天后过期

    return resp


if __name__ == '__main__':
    app.run()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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

from flask import Flask, session,Response
import os
from datetime import timedelta
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)  # 配置session使用的秘钥


@app.route('/')
def set_session_info():
    resp = Response('前端')
    session['username'] = 'yudengwu'
    session['userphone'] = 'yudengwu'  # 可以指定多条session信息,统一放到响应的cookie中返回给浏览器
    #以下两步设置过期时间
    session.permanent = True #必须要有
    app.permanent_session_lifetime = timedelta(minutes=10)

    return resp


if __name__ == '__main__':

    app.run()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

2.2.3 获取session

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

from flask import Flask, session,Response
import os

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


@app.route('/')
def set_session_info():
    resp = Response('前端')
    session['username'] = 'yudengwu'
    session['userphone'] = 'yudengwu'  # 可以指定多条session信息,统一放到响应的cookie中返回给浏览器

    return resp

@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为空"

if __name__ == '__main__':
    app.run()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

2.2.4删除session

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

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

from flask import Flask, session,Response
import os
from datetime import timedelta
app = Flask(__name__)
app.config['SECRET_KEY'] = os.urandom(24)  # 配置session使用的秘钥


@app.route('/')
def set_session_info():
    resp = Response('前端')
    session['username'] = 'yudengwu'
    session['userphone'] = 'yudengwu'  # 可以指定多条session信息,统一放到响应的cookie中返回给浏览器
    #以下两步设置过期时间
    session.permanent = True
    app.permanent_session_lifetime = timedelta(minutes=10)

    return resp

@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为空"

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


if __name__ == '__main__':

    app.run()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/540529
推荐阅读
相关标签
  

闽ICP备14008679号