网站首页 > 知识剖析 正文
什么是Cookie?
浏览器和服务器之间的请求和响应,我们已经很熟悉了,这里我们把请求响应称为会话,像是浏览器和服务器在聊天,在会话。在一次会话结束后,浏览器与服务器之间的连接就会关闭。再次请求响应时需要建立新的连接,这就是意味着上次会话中发生的事情,本次会话是不知道的。
那怎么记住会话状态呢?这就用到了cookie,cookie实际上是一小段文本信息,在这段文本中记录了上次会话的一些状态,所谓状态也就是浏览器服务器交互过程中的一些数据,用我们刚才的例子,就是在cookie中记录了汉堡的数量。浏览器第1次访问服务器后,在服务器返回的响应中会将cookie传递给浏览器。浏览器以后再访问服务器时,会带着cookie向服务器发起请求,这样cookie就在浏览器和服务器之间相互传递,通过cookie就可以实现跟踪会话,保存状态了。
设置Cookie和获取Cookie
现在我们想在cookie中设置name是小冰这样信息,键值对的形式,怎么设置呢?可以通过response对象来设置,response并不陌生,服务器每次返回的响应都是一个response对象。response对象有一个方法set_cookie用来设置cookie,方法中有三个参数,第一个参数是键,第二个参数就是值,这里键是name,值就是小冰,还有第三个参数,为cookie的有效期,如果不设置这个参数,那么默认是浏览器关闭,cookie就会消失。
@app.route('/', methods=['GET'])
def home():
return render_template('g_home.html')
@app.route('/login', methods=['GET'])
def login_page():
# 在下方写你的代码:获取cookie并验证,如果是yes则重定向到首页
auto_login = request.cookies.get('auto_login')
if auto_login == 'yes':
return redirect('/')
return render_template('g_login.html')
@app.route('/login', methods=['POST'])
def login():
email = request.form.get('email')
password = request.form.get('password')
if email or password is "":
return render_template('g_login.html')
response = redirect('/')
# 在下方写你的代码:设置cookie,键为auto_login,值为yes
response.set_cookie('auto_login', 'yes')
return response
Session:开发过程配置信息
class DefaultConfig:
DEBUG = True
class DevelopmentConfig(DefaultConfig):
SECRET_KEY = 'NPHjiklfM'
def createFlaskApp(config):
app = Flask(__name__)
app.config.from_object(config)
app.config.from_envvar('CAT_CONFIG', silent=True)
return app
app = createFlaskApp(DevelopmentConfig)
@app.route('/')
def index():
# print(app.config['SECRET_KEY'])
# print(app.config['USERNAME'], app.config['PASSWORD'])
return render_template('index.html')
Cookie的弊端
使用Cookie也可以保存用户登录信息,但是存在一些弊端,首先它保存在客户端,容易被窃取,其次使用明文传输,容易被拦截,最后Cookie还有大小限制,每个cookie大小不能超过4KB,否则会被截掉,那更好的办法就是使用Session。
Session概念
Session是记录用户状态的一种方法,首先它是在服务器上存储信息,比较安全。当用户登录的时候,发送请求给服务器,服务器接收之后,会生成Session存储用户信息,并且这个Session也是会加密的,然后把Session的id返回给浏览器,这个id就像是Session的身份证,一个用户信息,就用一个id去标识。
Session验证
再登录的时候怎么验证用户是否登录过呢?其实很简单,在第一次登录成功后,返回给浏览器session的id了,它就像一把钥匙,等到下次再访问登录页的时候,就会把session_id放在请求头一起返回,那服务器接收之后,会根据session_id找到用户信息,如果存在,就返回首页index.html。
Flask中的Session
Flask已经给我们提供了session对象,只要使用from flask import session就可以导入这个对象了。
Session中存数据
导入session后,调用session对象,以键值的方式存储数据,比如session['user'] = 'xiaotong',键是user,值就是xiaotong ,这样就把用户名存储到session中了,存储的格式就是{'user':'xiaotong'},格式可以看做是字典。
其实,使用session 不仅可以记录用户登录状态,还可以记录一些实时的隐私数据,比如下面这个项目场景:在小小银行家的项目中,我们可以输入存储的金额,点击提交后,会显示成功存储多少元钱,那我们就可以把存款金额存到session中,然后点击查询余额的时候,就可以在session中取出金额,并展示。
先来完成第一步,点击存钱,发送POST请求,此时在session中存储金额,使用的方法是session['money'] =[money] ,然后服务器再把获取到的存款金额返回即可。
@app.route('/save', methods=['POST'])
def save():
# 在下方写你的代码:设置session,保存用户存款金额
money = int(request.form.get('money'))
if 'money' not in session:
session['money'] = [money]
else:
tmp_li = session['money']
tmp_li.append(money)
session['money'] = tmp_li
return '成功存储了%s元' % money
Session中取数据
通过id找session这些繁琐的操作,session对象都已经帮我们做好了,直接使用session.get('user')就可以取出用户信息了,参数是session的键user,也可以使用session['user'],不过这2种方法是有区别,第一种方法,即使user不存在,也不会报错,第二种,如果user不存在,就会报错,所以建议大家使用第一种方法。
查询的结果,也有两种情况,一种是存在,即是xiaotong 另一种是不存在,就是None学完从session中取值的方法之后,我们就可以继续完成小小银行家的项目了。
分析一下流程,当点击查询余额时,会发送get请求,服务器在接收到请求之后,通过session.get('money') 方法,获取存款数据,并计算总金额,返回给浏览器即可。
@app.route('/query', methods=['GET'])
def query():
# 在下方写你的代码:获取session,计算总金额
count = sum(session.get('money'))
return '余额:%s元' % count
Session加密
在flask项目中对session加密很重要,用app.secret_key = '123456' 的方式就是设置了秘钥,其中app,就是flask对象,值必须是字符串类型,这个密钥,可以帮助我们给session加密,并且还很重要,一旦使用了session,就必须设置秘钥,否色程序会报错。
相关推荐
猜你喜欢
- 2025-05-02 测试进阶:实现跨请求地保持登录的神器session你get了么?
- 2025-05-02 Python 爬虫入门五之 Cookie 的使用
- 2025-05-02 在Node应用中实施Web认证的四大方法
- 2025-05-02 PHP防火墙代码,防火墙,网站防火墙,WAF防火墙,PHP防火墙大全
- 2025-05-02 程序员和IT人都应该懂的知识:HTTP入门图解
- 2025-05-02 如何请求一个需要登陆才能访问的接口(基于cookie)——apipost
- 2025-05-02 提高 PHP 代码质量的 36 计(如何提高php技术)
- 2025-05-02 彻底搞懂Token、Session和Cookie(token和cookie sessions什么区别)
- 2025-05-02 超详细的网络抓包神器 tcpdump 使用指南
- 2025-05-02 reGeorg搭建HTTP隧道和流量分析(如何建立gre隧道)
- 最近发表
-
- 测试进阶:实现跨请求地保持登录的神器session你get了么?
- Python 爬虫入门五之 Cookie 的使用
- 在Node应用中实施Web认证的四大方法
- PHP防火墙代码,防火墙,网站防火墙,WAF防火墙,PHP防火墙大全
- 程序员和IT人都应该懂的知识:HTTP入门图解
- 如何请求一个需要登陆才能访问的接口(基于cookie)——apipost
- 提高 PHP 代码质量的 36 计(如何提高php技术)
- 彻底搞懂Token、Session和Cookie(token和cookie sessions什么区别)
- 一文详解Python Flask模块设置Cookie和Session
- 超详细的网络抓包神器 tcpdump 使用指南
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)