在上篇文章中,我们学习了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等相关文章!