脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - python flask基于cookie和session来实现会话控制的实战代码

python flask基于cookie和session来实现会话控制的实战代码

2024-03-25 16:58景天科技苑 Python

所谓的会话(session),就是客户端浏览器和服务端网站之间一次完整的交互过程,本文介绍falsk通过cookie和session来控制http会话的全部解析,通常我们可以用cookie和session来保持用户登录等,感兴趣的朋友一起看看吧

python flask基于cookie和session来实现会话控制的实战代码

http的会话控制

所谓的会话(session),就是客户端浏览器和服务端网站之间一次完整的交互过程.

会话的开始是在用户通过浏览器第一次访问服务端网站开始.

会话的结束时在用户通过关闭浏览器以后,与服务端断开.

所谓的会话控制,就是在客户端浏览器和服务端网站之间,进行多次http请求响应之间,记录、跟踪和识别用户的信息而已。

为什么要有会话控制?因为 http 是一种无状态协议,浏览器请求服务器是无状态的。

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

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

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

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

  • 在客户端存储信息使用Cookie(废弃),token[jwt,oauth]
  • 在服务器端存储信息使用Session,数据库

Cookie

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

使用场景: 登录状态, 浏览历史, 网站足迹,购物车 [不登录也可以使用购物车]

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

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

如访问fuguang.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到fuguang.com写的Cookie信息,只能获取到baidu.com的Cookie信息。

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

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

python flask基于cookie和session来实现会话控制的实战代码

1.设置cookie

设置cookie需要通过flask的Response响应对象来进行设置,由响应对象会提供了方法set_cookie给我们可以快速设置cookie信息。

视图函数如下:

@app.route("/set_cookie")
def set_cookie():
    """设置cookie,通过response传递到客户端进行保存"""
    response = make_response('默认首页')
    response.set_cookie('username', 'jingtian')            # session会话期有效,关闭浏览器后当前cookie就会被删除 如果没有设置max_age,则当前cookie变量会在浏览器关闭(会话结束以后被浏览器删除)
    response.set_cookie('user', 'jigntian', max_age=30 )   # 指定有效时间,过期以后浏览器删除cookie,max_age=30秒
    return response

python flask基于cookie和session来实现会话控制的实战代码

浏览器查看cookie

python flask基于cookie和session来实现会话控制的实战代码

2.获取cookie

#获取cookie
@app.route("/get_cookie")
def get_cookie():
    """获取来自客户端的cookie"""
    print(request.cookies)  # ImmutableMultiDict([])
    username = request.cookies.get('username')  # 没有值则返回None
    user = request.cookies.get('user')          # 没有值则返回None
    print(f"username={username},user={user}")   # username=xiaoming,user=xiaoming
    return "get cookie"

浏览器访问

python flask基于cookie和session来实现会话控制的实战代码

终端打印,失效的cookie获取不到位None

python flask基于cookie和session来实现会话控制的实战代码

3.删除cookie

cookie保存客户端浏览器中的,所以服务端无法直接删除cookie
要实现删除cookie,只能告诉浏览器,cookie过期了,让浏览器自动删除
删除cookie,重新设置cookie的时间,让浏览器自己根据有效期来删除

#删除cookie
@app.route("/del_cookie")
def del_cookie():
    response = make_response('del cookie')
    # 删除操作肯定是在浏览器完成的,所以我们重置下cookie名称的对饮有效时间为0,此时cookie的值已经不重要了。
    response.set_cookie('user', '', max_age=0)
    response.set_cookie('username', '', max_age=0)
    return response

python flask基于cookie和session来实现会话控制的实战代码

浏览器访问,课件浏览器cookie已被删除

python flask基于cookie和session来实现会话控制的实战代码

完整代码:

from flask import Flask, make_response,request
# 应用实例对象
app = Flask(__name__)
#设置cookie
@app.route("/set_cookie")
def set_cookie():
    """设置cookie,通过response传递到客户端进行保存"""
    response = make_response('默认首页')
    response.set_cookie('username', 'jingtian')            # session会话期有效,关闭浏览器后当前cookie就会被删除
    response.set_cookie('user', 'jigntian', max_age=30 )   # 指定有效时间,过期以后浏览器删除cookie,max_age=30秒
    return response
#获取cookie
@app.route("/get_cookie")
def get_cookie():
    """获取来自客户端的cookie"""
    print(request.cookies)  # ImmutableMultiDict([])
    username = request.cookies.get('username')  # 没有值则返回None
    user = request.cookies.get('user')          # 没有值则返回None
    print(f"username={username},user={user}")   # username=jigntian,user=jigntian
    return "get cookie"
#删除cookie
@app.route("/del_cookie")
def del_cookie():
    # cookie保存客户端浏览器中的,所以服务端无法直接删除cookie
    # 要实现删除cookie,只能告诉浏览器,cookie过期了,让浏览器自动删除
    """删除cookie,重新设置cookie的时间,让浏览器自己根据有效期来删除"""
    response = make_response('del cookie')
    # 删除操作肯定是在浏览器完成的,所以我们重置下cookie名称的对饮有效时间为0,此时cookie的值已经不重要了。
    response.set_cookie('user', '', max_age=0)
    response.set_cookie('username', '', max_age=0)
    return response
if __name__ == '__main__':
    # 启动项目的web应用程序
    app.run(host="0.0.0.0", port=5000, debug=True)

cookie各阶段操作流程

python flask基于cookie和session来实现会话控制的实战代码

Session

对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如手机号、验证码等信息

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

Session依赖于Cookie,session的ID一般默认通过cookie来保存到客户端。名字一般叫:session

flask中的session需要加密,所以使用session之前必须配置SECRET_KEY选项,否则报错.

如果将来希望session的生命周期延长,可以通过修改cookie中的sessionID的有效期来完成配置。

session实现方案

python flask基于cookie和session来实现会话控制的实战代码

注意:一般框架都是把session数据保存到服务端,但是,flask里面的session是基于token方式存储在客户端的,并没有按照传统的方式保存在服务端的文件中。

python flask基于cookie和session来实现会话控制的实战代码

session的ID存在有效期的,默认是会话期,会话结束了,session_id就废弃了。

1.设置session

设置session视图函数如下:

#因为falsk中的session是基于cookie加密实现的,所以使用之前必须设置SECRET_KEY选项

app.config['SECRET_KEY'] = 'dafssg231bfvxvdsfwrqdqfafaffsgsbfsfsgs'
#设置session
@app.route("/set_session")
def set_session():
    """设置session"""
    session['username'] = 'jingtian'
    session['info'] = {
        "name": "jingtian",
        "age": 16,
    }
    print(session,type(session))
    return "set_session"

python flask基于cookie和session来实现会话控制的实战代码

浏览器访问,session保存到客户端的cookie中

python flask基于cookie和session来实现会话控制的实战代码

看下session和类型

python flask基于cookie和session来实现会话控制的实战代码

2.设置session有效期

 后端Flask跟浏览器交互默认情况下,session cookie会在用户关闭浏览器时清除。

通过将session.permanent属性设为True可以将session的有效期延长为31天,也可以通过操作app的配置PERMANENT_SESSION_LIFETIME来设置session过期时间。
设置有效期,需要到导包

from datetime import timedelta
# 以下两步设置过期时间
session.permanent = True # 开启设置有效期,默认为31天后过期
app.permanent_session_lifetime = timedelta(minutes=10)
return "set_session"

python flask基于cookie和session来实现会话控制的实战代码

浏览器访问,可以看到session有效期为10分钟

python flask基于cookie和session来实现会话控制的实战代码

4.获取session

@app.route("/get_session")
def get_session():
    """获取session"""
    print(session.get('username'))
    print(session.get('info'))
    return "get session"

浏览器访问

python flask基于cookie和session来实现会话控制的实战代码

终端打印session

python flask基于cookie和session来实现会话控制的实战代码

5.删除session

@app.route("/del_session")
def del_session():
    """删除session,键如果不存在,则会抛出异常,所以删除之前需要判断键是否存在。"""
    if "username" in session:
        session.pop("username")
    if "info" in session:
        session.pop("info")
    return "del_session"

浏览器访问,session被删除

python flask基于cookie和session来实现会话控制的实战代码

完整代码:

from flask import Flask, session
from datetime import timedelta
# 应用实例对象
app = Flask(__name__)
#因为falsk中的session是基于cookie加密实现的,所以使用之前必须设置SECRET_KEY选项
app.config['SECRET_KEY'] = 'dafssg231bfvxvdsfwrqdqfafaffsgsbfsfsgs'
#设置session
@app.route("/set_session")
def set_session():
    """设置session"""
    session['username'] = 'jingtian'
    session['info'] = {
        "name": "jingtian",
        "age": 16,
    }
    print(session,type(session))
    # 以下两步设置过期时间
    session.permanent = True # 开启设置有效期,默认为31天后过期
    app.permanent_session_lifetime = timedelta(minutes=10)
    return "set_session"
#获取session
@app.route("/get_session")
def get_session():
    """获取session"""
    print(session.get('username'))
    print(session.get('info'))
    return "get session"
#删除session
@app.route("/del_session")
def del_session():
    """删除session,键如果不存在,则会抛出异常,所以删除之前需要判断键是否存在。"""
    if "username" in session:
        session.pop("username")
    if "info" in session:
        session.pop("info")
    return "del_session"
if __name__ == '__main__':
    # 启动项目的web应用程序
    app.run(host="0.0.0.0", port=5000, debug=True)

使用过程中,session是依赖于Cookie的,所以当cookie在客户端被删除时,对应的session就无法被使用了。

总结:
综上,就是falsk通过cookie和session来控制http会话的全部解析,通常我们可以用cookie和session来保持用户登录等,falsk持续更新中,总有适合你的!!!

到此这篇关于python flask基于cookie和session来实现会话控制的文章就介绍到这了,更多相关python 会话控制内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/littlefun591/article/details/136909045

延伸 · 阅读

精彩推荐
  • Python如何在Python中妥善使用进度条详解

    如何在Python中妥善使用进度条详解

    python的进度条有很多第三方库,有些做的比较炫酷,下面这篇文章主要给大家介绍了关于如何在Python中妥善使用进度条的相关资料,文中通过示例代码介绍的非...

    费弗里7142022-11-22
  • PythonPython温度转换实例分析

    Python温度转换实例分析

    这篇文章主要介绍了Python温度转换实例分析,具有一定借鉴价值,需要的朋友可以参考下...

    powerpoint_201614622021-01-05
  • PythonPython多线程threading创建及使用方法解析

    Python多线程threading创建及使用方法解析

    这篇文章主要介绍了Python多线程threading创建及使用方法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋...

    吞风吻雨ii5122020-06-17
  • Python如何用Python画一些简单形状你知道吗

    如何用Python画一些简单形状你知道吗

    这篇文章主要介绍了用Python作图的一个简单实例,通过turtle模块实现作图,具有一定参考价值,需要的朋友可以了解下希望能给你带来帮助...

    我帅的是不是无可救药6732021-12-21
  • Python对python 调用类属性的方法详解

    对python 调用类属性的方法详解

    今天小编就为大家分享一篇对python 调用类属性的方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    n_laomomo8842021-07-28
  • Python使用Python实现跳一跳自动跳跃功能

    使用Python实现跳一跳自动跳跃功能

    这篇文章主要介绍了使用Python实现跳一跳自动跳跃功能,本文图文并茂通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考...

    数据森麟10742021-08-07
  • Pythonpython使用装饰器和线程限制函数执行时间的方法

    python使用装饰器和线程限制函数执行时间的方法

    这篇文章主要介绍了python使用装饰器和线程限制函数执行时间的方法,主要涉及timelimited函数的使用技巧,非常具有实用价值,需要的朋友可以参考下 ...

    lele6682020-06-09
  • PythonPython unittest模块用法实例分析

    Python unittest模块用法实例分析

    这篇文章主要介绍了Python unittest模块用法,结合实例形式分析了unittest模块功能及相关函数使用技巧,需要的朋友可以参考下...

    canlynet10542021-02-24