Flask Session 介绍

Posted Flask学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Flask Session 介绍相关的知识,希望对你有一定的参考价值。


10299

HTTP Session

1.什么是Session

Session 中文翻译是会话.和Cookie 类似,它也是用来保存用户状态的.Cookie 有它的弊端,本身保存在客户端(如浏览器),而且是一个可读明文文件.这就意味着它很容易遭受伪装攻击(例如黑客B作为中间人伪造了A的Cookie 信息,发起转账服务).为了解决类似这样的问题,Session 被被开发使用.

Session是一个思路/概念,一个服务器存储授权信息的解决方案,不同的服务器,不同的框架,不同的语言有不同的实现,虽然实现不一样,但是他们的目的都是服务器为了方便存储数据的.

先来看一下Cookie 是如何工作的(基于无状态的HTTP协议).

Cookie 最常用用于登录和登出操作.下面以google登陆为例来看实际中如如何登陆的:

  1. 浏览器先向 www.google.com的服务器发送一个 HTTP 请求.通常是一个 POST 请求,包含用户名和密码.
  2. 请求到达服务器后,服务器会验证用户的合法性.如果验证成功,服务器会给浏览器发送一个 Response with cookie(通常是一个 GUID或者任何服务器的唯一标识)
  • Cookie会放置在 Response headSet-Cookie 字段中
  1. 浏览器在收到 Respnse with cookie 后,会把 Cookie保存在磁盘中(和 Cookie的过期时效有关)
  2. 此后,如果用户在同一浏览器中的新标签页访问 www.google.com,浏览器会在 Response 中自动带上 cookie
  3. google.com服务器在读到这个 cookie时会验证它的合法性.服务器通常都会在内存里维护一个所有它生成的 Cookie 的字典.通常用 sessionID为键, UserID 或者其他标识用户信息的内容作为值.
  4. 在认证完用户后,服务器就可以给用户发送自定义的动态页面.通常都包含该用户的特殊信息(如名字,头像,好友列表,活动订阅等等)

在基于Cookie 的基础上,服务器返回的是不是简单的键值对,而是在服务器端生成Session,它包含了Session_ID用来唯一标识用户,并包含了生命周期等字段.

  1. 浏览器先向 www.google.com的服务器发送一个 HTTP 请求.通常是一个 POST 请求,包含用户名和密码.
  2. 请求到达服务器后,服务器会验证用户的合法性.如果验证成功,服务器会创建一个 Session ,它包含一个唯一标识用户的 Session_ID(它的值是一个既不会重复,又不容易找到规律的字符串),通常服务器会把 Session_ID用户的对应 保存在数据库中,如 mysql adisMemcached等等(他们都是保存在服务器本地的.)
  3. 服务器给浏览器发送 Response with cookie( cookie 中包含 Session_ID)
  4. 浏览器在收到 Respnse with cookie 后,会把 Cookie保存在磁盘中.
  5. 此后,如果用户在同一浏览器中的新标签页访问 www.google.com,浏览器会在 Response 中自动带上 cookie

2.在Flask中使用Session

Flask的原生Session 中,并不是保存Session_ID,而是将session数据加密,然后存储在cookie中.

>>> from flask import session
>>> type(session)
<class 'werkzeug.local.LocalProxy'>

session 是一个类似字典的对象,它支持字典的操作方法(比如pop()/get()等).

Flask中要使用session,必须设置一个秘钥用于加密,为了更加安全,可以使用os.urange(24) 生成一个24位的随机字符串.

它的简单示例如下(参考:https://github.com/ningwenyan/demo_code/tree/master/flask_demo_code/T19):

from flask import Flask
from flask import session,escape
from flask import request,redirect,url_for
import os

app = Flask(__name__)
app.config.update({
'DEBUG':True,
'TEMPLATES_AUTO_RELOAD':True,
# 使用session必须设置秘钥
'SECRET_KEY':os.urandom(24# 生成24位随机数
})

# 也可以使用如下方法创建 secret_key
# app.secret_key=os.urandom(24)

@app.route('/')
def index():
        if 'username' in session:
                # escape 用来替换html中的16进制特殊符号
                return 'Logged in as {}.<a href="/logout/">Logout</a>'.format(escape(session.get('username')))
           return 'You are not logged in.<a href="/login/">Login</a>'

@app.route('/login/',methods=['GET','POST'])
def login():
        if request.method == 'POST':
            session['username'] = request.form.get('username')
            return redirect(url_for('index'))
        login_html = """
            <form action="" method="POST">
            <p><input type=text name=username></p>
            <p><input type=submit value=Login></p>

            </form>
            """

         return  login_html

@app.route('/logout/')
def logout():
    """删除 session"""
    session.pop('username',None)
    return redirect(url_for('index'))

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

以上基本包含了session 的创建,读取和删除操作.

删除所有的session 可以使用session.clear() .

使用浏览器访问http://127.0.0.1:5000 ,可以查看session 的过程.

  1. 访问 http://127.0.0.1:5000 ,此时并没有产生 session
Flask Session 介绍
  1. 点击 login 后, GET 请求跳转到 login页面.没有生成 session
Flask Session 介绍
  1. 填写用户名 submit 之后,使用 POST请求提交到服务器,服务器生成 session并加密返回 cookie,由于后台代码中有跳转到首页,它会跳转一次,但是会携带 cookie跳转.

Flask Session 介绍Flask Session 介绍

  1. 点击 logout 后,登出系统,测试服务器删除 session

3.session 设置超时时间.

如上,可以看到在服务器端sessioncookie 做了一层封装.session当然也支持过期时间操作.

如果没有指定session的过期时间,那么默认是浏览器关闭后就自动结束.在Flask中,

  • 通过设置 session.permanent=True ,这个参数会延长到31天.
  • 可以通过给 app.config设置 PERMANENT_SESSION_LIFETIME来更改过期时间,这个值的数据类型是 datetime.timedelay类型.
  • 它一般用于登录页面的 记住我选项.点击选项会设置更长的时间.
from flask import Flask
from flask import session,escape
from flask import request,redirect,url_for
import os
from datetime import timedelta

app = Flask(__name__)
app.config.update({
    'DEBUG':True,
    'TEMPLATES_AUTO_RELOAD':True,
    # 使用session必须设置秘钥
    'SECRET_KEY':os.urandom(24), # 生成24位随机数
    # 设置超时时间
    'PERMANENT_SESSION_LIFETIME': timedelta(days=7)
})

# 也可以使用如下方法创建 secret_key
# app.secret_key=os.urandom(24)

@app.route('/')
def index():
    if 'username' in session:
        # escape 用来替换html中的16进制特殊符号
        return 'Logged in as {}.<a href="/logout/">Logout</a>'.format(escape(session.get('username')))
    return 'You are not logged in.<a href="/login/">Login</a>'

@app.route('/login/',methods=['GET','POST'])
def login():
    if request.method == 'POST':
        # 判断复选框是否有值
        if request.form.get('remember'):
            session['username'] = request.form.get('username')
            session.permanent =True
            return redirect(url_for('index'))
    login_html = """
    <form action="" method="POST">
    <p><input type=text name=username></p>
    <p><input type=submit value=Login></p>
    <label for="">7 days remember me</label>
    <input type="checkbox" name='remember' value="7 days remember me">
    </form>
    """

    return  login_html

@app.route('/logout/')
def logout():
    """删除 session"""
    session.pop('username',None)
    return redirect(url_for('index'))

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

4.session存储在数据库中

虽然Flask 实现了session ,但是还是不能支持存储在数据库中.为什么要存储在数据库中,因为这样会更加安全.

这就需要一个新的插件Flask-Session

- END -
Flask学习笔记 发起了一个读者讨论 留言板


以上是关于Flask Session 介绍的主要内容,如果未能解决你的问题,请参考以下文章

Flask之Flask_Session插件

flask-session

Flask_Session插件

flask-session 蓝图使用

flask——session

Flask之Flask-Session 򁄘