什么是状态保持
定义记录用户访问状态一种机制。例如:用户是否登陆过,用户的搜索记录
- 因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
- 无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
- 无状态原因:浏览器与服务器是使用socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。 有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
- 实现状态保持主要有两种方式: 在客户端存储信息使用Cookie 在服务器端存储信息使用Session
Cookie:指某些网站为了辨别用户身份、进行会话跟踪而储存在用户本地的数据(通常经过加密)。
- 复数形式Cookies。
- Cookie最早是网景公司的前雇员Lou Montulli在1993年3月的发明。
- Cookie是由服务器端生成,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就发送该 Cookie给服务器(前提是浏览器设置为启用cookie)。
- Cookie的key/value可以由服务器端自己定义。
应用:
- 最典型的应用是判定注册用户是否已经登录网站,用户可能会得到提示,是否在下一次进入此网站时保留用户信息以便简化登录手续,这些都是Cookie的功用。
- 网站的广告推送,经常遇到访问某个网站时,会弹出小窗口,展示我们曾经在购物网站上看过的商品信息。
- 购物车,用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookie,以便在最后付款时提取信息。
提示:
- Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用
- Cookie基于域名安全,不同域名的Cookie是不能互相访问的
- 如访问itcast.cn时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到itcast.cn写的Cookie信息
- 浏览器的同源策略
- 当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息
代码实现
from flask import Flask, make_response, request
app = Flask(__name__)
@app.route("/")
def index():
isHelp = request.cookies.get('isHelp')
if isHelp:
return 'index page is show'
# 自定义响应对象
response = make_response('Help page is show')
# 设置cookie及cookie过期时间3600s
response.set_cookie('isHelp', 'python', max_age=3600)
return response
if __name__ == '__main__':
app.run(debug=True)
session:对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息
免密码登陆
from flask import Flask, request, session, redirect, url_for
app = Flask(__name__)
# 设置秘钥,随机字符串
app.secret_key = 'bMNznSI1Kt/c6+05oIfk/+p81SbOJ2EAGILo/VJbySwmawOeD0HQ2dmyRs0xRQ=='
@app.route("/")
def index():
# 获取session中的用户信息,如果没有就是None
username = session.get('username')
print(username)
if username:
return '欢迎回来%s' % username
return redirect(url_for('login'))
@app.route('/login', methods=['GET', 'POST'])
def login():
# 如果是GET请求方式
if request.method == 'GET':
with open('login.html') as f:
content = f.read()
return content
# 获取数据
username = request.form.get('username')
password = request.form.get('password')
print(type(password))
# 如果是post请求方式
# 判断账号密码是否正确
if username == 'zs' and password == '123':
# 储存账号密码,记录用户的登陆状态
session['username'] = username
session['password'] = password
# 跳转到首页
return redirect(url_for('index'))
else:
return '登陆失败'
if __name__ == '__main__':
app.run(debug=True)