Flask框架——Session与Cookie

作者: 白巧克力LIN | 来源:发表于2022-07-19 23:55 被阅读0次

    在上篇文章中,我们学习了Flask框架——模型关系(多对多关系),这篇文章我们学习Flask框架——Cookie与Session。

    在浏览网站的过程中,我们经常会遇到需要登录的情况,有些页面只有登录之后才可以访问,登录之后关闭浏览器,再重新打开该网站时,就自动登录了,但有时候过段时间又需要重新登录,这里面涉及了Cookie和Session的相关知识。

    无状态HTTP

    在了解Cookie和Session之前,我们先了解HTTP的一个特点——无状态。

    HTTP的无状态是指HTTP协议对事务处理是没有记忆能力的,服务器并不知道客户端处于什么状态。客户端向服务器发送请求后,服务器解析请求并返回响应,服务器负责完成这个过程,但服务器不会记录前后状态的变化,也就是缺少状态的记录。

    假如这个请求是需要用户登录后才能发送的,由于服务器没有记录我们登录的状态,那么客户端就必须登录后再重新发送请求,就导致需要传递一些重复的请求才能获取相应的响应,这样太浪费资源了,于是可以识别用户信息的技术出现了——Cookie和Session。

    • Cookie:客户端,有了Cookie,浏览器在下次访问相同网页时,就会自动附带上它,并发送给服务器,服务器通过Cookie识别出是哪个用户在访问,然后判断此用户是否处于登录状态,并返回对应的响应。

    • Session:服务端,用来保存用户的Session信息、属性以及配置信息。

    好了,简单了解了无状态HTTP、Cookie及Session的概念后,接下来我们使用Flask框架来实现网站状态的保持。

    Cookie

    Cookie用来识别用户身份,在Flask程序中,如何利用Cookie保持用户状态呢。在客户端第一次请求服务器时,服务器会返回一个响应头带有Set-Cookie字段的响应给客户端,这个字段用来标记用户。客户端浏览器会把Cookie保存起来,当下一次请求相同的网站时,把保存的Cookie放在一起交给服务器,服务器通过Cookie来识别用户,并返回相应的响应。

    在Flask中,Cookie是在响应对象中设置的,所以先要在视图函数的返回值中获取响应对象,再使用set-cookie函数存储Cookie。

    创建一个Flask项目,其app.py代码如下所示:

    from flask import Flask, render_template, request, redirect, url_for
    
    app = Flask(__name__)
    
    #登录视图函数
    @app.route('/login')
    def login():
        return render_template('login.html')    #渲染login.html文件
    
    if __name__ == '__main__':
        app.run()
    

    这里创建一个简单的登录视图函数,在templates文件夹中创建模板文件login.html,通过render_template()方法渲染login.html,login.html代码如下所示:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>登录</title>
    </head>
    <body>
          <form action = "/getcookie" method = "POST">
             <p><h3>请输入你的用户名:</h3></p>
             <p><input type = 'text' name = 'username'/></p>
             <p><input type = 'submit' value = 'Login'/></p>
          </form>
    </body>
    </html>
    

    这个模板文件login很简单,通过form表单接收用户输入的用户名,当点击Login按钮时,将用户名传递到getcookie视图函数中,在app.py文件中getcookie视图函数代码如下所示:

    @app.route('/getcookie',methods=['POST','GET'])
    def getcookie():
        if request.method=='POST':          #请求类型为POST
            username=request.form['username']   #获取请求中的username
            response = redirect(url_for('index'))   #重定向到index路由中,并返回响应对象
            response.set_cookie('username',str(username),max_age=18000) #设置cookie值及属性
            return response
    

    当请求类型为POST时,通过request.form()方法将请求中的username获取并保存在username中,使用redirect重定向到index视图函数中,redirect()方法的返回值是个响应对象,获得响应对象后,我们通过.set_cookie()方法来设置cookie。

    .set_cookie()方法语法结构如下:

    Response.set_cookie(
        key,        #键
        value='',    #值
        max_age=None,   #cookie寿命,以秒为单位,None表示http-only
        expires=None,   #失效时间,datetime对象或者时间戳
        path='/',       #cookie的有效路径
        domain=None,    #cookie有效域
        secure=None,
        httponly=False)
    

    除了通过redirect()方法获得响应对象外,还可以通过以下方式获取:

    response=render_template()      #模板渲染       
    response=Response()             #Response对象
    response=make_response()        #自定义response对象
    response=jsonify()              #返回包含json格式数据响应
    

    通过getcookie视图函数设置cookie值后,重定向到index视图函数中,在app.py文件中index代码如下所示:

    @app.route('/index')
    def index():
        username = request.cookies.get('username',None)     #获取cookie值
        if username!=None:
            return render_template('logout.html',username=username) #渲染logout.html到网页中并传递username值
        else:
            return render_template('logout.html')
    

    在index视图函数中,通过request.cookies.get()方法获取名为username的cookie值,根据username值决定是否将username值传递到渲染的logout.html网页中。

    在templates文件夹中创建模板文件logout.html,logout.html文件很简单,代码如下所示:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Title</title>
    </head>
    <body>
    <h3>现在登录的用户为{{ username }}</h3>
    <a href="{{ url_for('logout') }}">退出</a>
    </body>
    </html>
    

    logout.html接收到username值后就会将该值呈现在网页中,接下来我们打开http://127.0.0.1:5000/login并在文本框中输入zhangsan,如下图所示:


    点击登录直接跳转到http://127.0.0.1:5000/index,如下图所示:
    打开浏览器设置查看Cookie的存储,

    在浏览器设置中,我们可以找到Cookie的存储情况,在cookie的有效时间内,每次访问http://127.0.0.1:5000/index自动登录。

    可以通过set_cookie()方法设置cookie,也可以通过.delete_cookie()方法删除cookie,这里我们通过创建logout视图函数来实现对cookie的删除,在app.py文件中logout视图函数代码如下所示:

    @app.route('/logout')
    def logout():
        response = redirect(url_for('index'))   #重定向到index视图函数中,获取响应对象
        response.delete_cookie('username')      #删除名为username的cookie值
        return response
    

    获取到响应对象再通过delete_cookie()方法将cookie值删除。当我们打开http://127.0.0.1:5000/index网页时,点击退出,如下图所示:


    这时我们在浏览器设置中查找cookie值,就会发现刚才上图的cookie信息已经被删除,所以我们重新打开http://127.0.0.1:5000/index时,没有用户信息。

    学习通过Cookie来保持网页的状态后,接下来我们通过Session来保持网页的状态。

    Session

    Session,也称为会话,本义是指有起有终的一系列动作、消息。

    在Web中,Session对象用来存储特定用户Session所需的属性及配置信息。这样当用户在页面之间跳转时,存储在Session对象中变量将不会丢失,会在整个用户中一直存在下去。当用户请求来自程序页面时,该用户还没有Session的话,那么Web服务器将自动创建一个Session对象,那么当Session过期或被放弃后,服务器将终止该Session。

    在Flask框架中,session是当做字典来使用的,接下来我们通过代码来使用session实现网页状态的保持。

    创建Flask项目,其app.py文件代码如下所示:

    from flask import Flask, render_template, request, redirect, url_for, session
    app = Flask(__name__)
    app.config['SECRET_KEY']='SDFAFASD'         #配置SECRET_KEY
    # 登录视图函数
    @app.route('/login')
    def login():
        return render_template('login.html')    #渲染login.html模板
    if __name__ == '__main__':
        app.run()
    

    因为Flask的session是通过加密之后放到了cookie中,所以只要用到了Flask的session模块就一定要配置“SECRET_KEY”这个全局宏。该值可以是任意字符串。

    我们创建一个简单的登录视图函数,通过render_template()方法将login.html模板文件渲染在网页中,这里的login.html我们用上面Cookie的login.html。

    接下来我们创建设置Session的getsession视图函数,代码如下所示:

    @app.route('/getsession',methods=['POST','GET'])
    def getsession():
        if request.method=='POST':
            username=request.form['username']       #获取请求的username值
            session['username']=username            #设置session为username
            session.permanent = True               #设置session有效时长
            return redirect(url_for('index'))       #将网页重定向到index中
    

    获取到请求username值,由于session是以字典的形式存在,所以我们需要以session['...‘]=值的形式传递,这个我们通过session.permanent=True,将session的有效期延长至一个月,当没有设置session的有效期时,当关闭浏览器时,网页就是删除session数据信息。除了将session有效期设置为一个月,还可以通过配置PERMANENT_SESSION_LIFETIME指定session有效时间,代码如下所示:

    app.config['PERMANENT_SESSION_LIFETIME'] = timedelta(hours=2)   #有效时长为2小时
    

    通过getsession视图函数设置session值后,重定向到index视图函数中,在app.py文件中index代码如下所示:

    @app.route('/index')
    def index():
        username=session.get('username')            #获取session中的username值
        if username!=None:
            return render_template('logout.html',username=username)     #渲染logou.html并传递username值
        else:
            return render_template('logout.html')
    

    和Cookie的index视图函数类似,只是将request.cookie改为session,在获取到username之后,根据username值判断是否传入render_template()渲染的网页中。这里的logout.html模板是用上面Cookie创建的logout.html模板。

    打开http://127.0.0.1:5000/login并在文本框中输入zhangsan,如下图所示:


    点击登录直接跳转到http://127.0.0.1:5000/index,如下图所示:

    在session的有效时间内,每次访问http://127.0.0.1:5000/index自动登录。

    如何删除session数据信息呢?删除session数据很简单,代码如下所示:

    @app.route('/logout')
    def logout():
        session.pop('username')                 #删除session中的username值
        session.clear()                        #删除session的所有值
        return redirect(url_for('index'))       #重定向到index页面中
    

    当我们打开http://127.0.0.1:5000/index网页时,点击退出,如下图所示:


    好了,关于Flask框架——Session和Cookie就讲到这里了,感谢观看!!!下篇文章学习Flask框架——flask-caching缓存。

    公众号:白巧克力LIN

    该公众号发布Python、数据库、Linux、Flask、自动化测试、Git等相关文章!

    相关文章

      网友评论

        本文标题:Flask框架——Session与Cookie

        本文链接:https://www.haomeiwen.com/subject/zcfeirtx.html