Flask session/cookie操作

简介

访问者的标识问题服务器需要识别来自同一访问者的请求。这主要是通过浏览器的cookie实现的。 访问者在第一次访问服务器时,服务器在其cookie中设置一个唯一的ID号——会话ID(session)。 这样,访问者后续对服务器的访问头中将自动包含该信息,服务器通过这个ID号,即可区 隔不同的访问者。

cookie

概念:

a. 客户端会话技术,浏览器的会话技术
b. 数据全部存储在客户端中
c. 存储使用的键值对结构进行存储
特性:
​ 支持过期时间
默认会自动携带本网站的cookie
不能跨域名
不能跨浏览器

创建:

Cookie是通过服务器创建的Response来创建的
设置: set_cookie('key', value, max_ages='', expires='')
删除,有三种删除方式

  1. 直接清空浏览器的cookie
  2. delete_cookie('key') 直接使用delete_cookie函数
  3. set_cookie('key', '', expires=0) 重新设置key的值为空,过期时间为0

获取:

在每次请求中,url都会向服务器传递request,在request中可以获取到cookie的信息
request.cookies.get('name')

例子1,设置cookie:

import datetime

@blue.route('/setcookie/')
def set_cookie():
    temp = render_template('index.html')
    response = make_response(temp)
    outdate = datetime.datetime.today() + datetime.timedelta(days=30)
    # 设置cookie中的name的存在时长,设置为30天才过期
    response.set_cookie('name', 'cocoococo', expires=outdate)
    return response

例子2, 删除cookie中的值

@blue.route('/setcookie/')
def set_cookie():
    temp = render_template('index.html')
    response = make_response(temp)
    # 第一种方式,通过set_cookie去删除
    response.set_cookie('name', '', expires=0)
    # 第二种凡是,del_cookie删除
    response.del_cookie('name')
    return response

例子3, 获取cookie中的值

@blue.route('/getcookie')
def get_cookie():
    name = request.cookies.get('name')
    
    return name

session

flask-session是flask框架的session组件
该组件则将支持session保存到多个地方
如:

redis
memcached
mongodb
sqlalchmey

安装

pip install flask-session
如果指定存在session的类型为redis的话,需要安装redis
pip install redis

语法

设置session:

session['key'] = value

读取session:

result = session['key'] # 如果内容不存在,将会报异常
result = session.get('key') #如果内容不存在,将返回None

删除session:

session.pop('key')

清空session中所有数据:

session.clear()

使用

我们在初始化文件中创建一个方法,通过调用该方法来获取到Flask的app对象

def create_app():
    app = Flask(__name__)
    # SECRET_KEY 秘钥
    app.config['SECRET_KEY'] = 'secret_key'
    # session类型为redis
    app.config['SESSION_TYPE'] = 'redis'
    # 添加前缀
    app.config['SESSION_KEY_PREFIX'] = 'flask'
    
    # 加载app的第一种方式
    se = Session()
    se.init_app(app=app)
    #加载app的第二种方式
    Session(app=app)
    app.register_blueprint(blueprint=blue)

    return app

案例

定义一个登陆的方法,post请求获取到username,直接写入到redis中,并且在页面中展示出redis中的username
a)需要先启动redis,开启redis-server,使用redis-cli进入客户端
b)定义方法

@blue.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        username = session.get('username')
        return render_template('login.html', username=username)
    else:
        username = request.form.get('username')
        session['username'] = username

        return redirect(url_for('first.login'))

c)定义模板


欢迎:{{ username }}

用户名:

d)redis中数据


image

注: 我们在定义app.config的时候订了SESSION_KEY_PREFIX为flask,表示存在session中的key都会加一个前缀名flask

你可能感兴趣的:(Flask session/cookie操作)