Flask框架——Session与Cookie

在上篇文章中,我们学习了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代码如下所示:




    
    登录


      

请输入你的用户名:

这个模板文件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文件很简单,代码如下所示:




    
    Title


现在登录的用户为{{ username }}

退出

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)