cookie 和session 的区别:
http协议是短连接(一次请求一次响应后断开),所以是无状态(每一次请求都是新的请求,跟之前的没有关系)。
但是有的时候需要保持记录状态,比如七天免登陆(记录用户名),用户的浏览记录,用户登录后可以直接访问一些私密信息的网页(比如网银登录后才可以操作额度)。怎么实现的?需要使用cookie和session。当然还是基于http协议。
cookie是保存在浏览器客户端的一些小文本,根据http协议规定,如果访问a域名网址,a的服务器响应写到浏览器客户端一些cookie,那么下一次再访问这个a域名网址的时候,浏览器会自动将那个cookie再发送给服务器。
cookie是不能跨域的。
cookie的属性
1、键:字符串类型
2、值:字符串类型 不能是中文
3、路径:父路径下设置的cookie,子路径可以访问,反之不行
举例:比如在/a下设置的cookie,访问/a/b路径,会发送cookie,反之不行。所以一般cookie的路径设置根路径/,这是访问此网址下的任何路径cookie都会被发送回去,然后使用。django设置cookie默认就是根路径
4、有效期
django里cookie有效期会会话结束后cookei会失效
会话结束就是当前浏览器被关闭
总之:cookie虽然能完成状态保持,但是不安全,因为它存储在当前浏览器中的,不能跨浏览器使用,也不能跨域名。可以被修改,所以相对不安全。
一般cookie一般用来存储安全性要求不高的数据,比如记录用户名,一般不用来记录敏感的信息,比如密码。、
cookie是保存到浏览器客户端的,而session将数据保存到服务端的。所以session更加安全,但是会增加服务器的压力。
一般将安全度要求不高的放在cookie中,安全度要求的高的放在session中。
session是基于cookie实现的。
django中默认配置把session数据存储到了数据库中,这里是mysql。
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗, 考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
所以:
将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
django
cookie 和 session都是不能跨域的。
cookie的属性
1、键:字符串类型
2、值:字符串类型 不能是中文
3、路径:父路径下设置的cookie,子路径可以访问,反之不行
举例:比如在/a下设置的cookie,访问/a/b路径,会发送cookie,反之不行。所以一般cookie的路径设置根路径/,这是访问此网址下的任何路径cookie都会被发送回去,然后使用。django设置cookie默认就是根路径
4、有效期
django里cookie有效期会会话结束后cookei会失效,session默认保存两周,会话结束就是当前浏览器被关闭
总之:cookie虽然能完成状态保持,但是不安全,因为它存储在当前浏览器中的,不能跨浏览器使用,也不能跨域名。可以被修改,所以相对不安全。
一般cookie一般用来存储安全性要求不高的数据,比如记录用户名,一般不用来记录敏感的信息,比如密码。、
cookie是保存到浏览器客户端(浏览器)的,而session将数据保存到服务端(数据库)的。所以session更加安全,但是会增加服务器的压力。
一般将安全度要求不高的放在cookie中,安全度要求的高的放在session中。
session是基于cookie实现的,cookie包含session。
django中默认配置把session数据存储到了数据库中,这里是mysql。
cookie的基本操作
1、创建cookie
response.set_cookie(键,值,有效期) 有效期单位是秒
2、删除cookie
response.delete_cookie(键)
3、获取cookie
request.COOKIES.get(键) #只有获取cookie的时候是request,其余都是response
**在设置cookie之前先配置:**设置时间:默认是用的UTC,与当前我们本地时间错了8小时。
cookie案例:记录用户名
1、路由:
2、视图:
session的基本操作用的全是request
1、创建session
request.session[键] = 值
有效期默认是2周可以修改
request.session.set_expiry(时间)单位是秒
2、获取session
request.session.get(键)
3、删除session
del request.session[键] 删除一个键值对
request.session.clear() 删除所有键值对
使用session当我们不使用用户登录系统的话,我们需要用session记住登录状态,设置权限。还要获取下一个路径,登录成功后帮客户跳转。还需要对密码进行加密存入数据库,后再加密对照。(密码加密在另一篇)
1、登录成功后创建session,session的值一般设置为用户的id,方便后续获取id.
制作装饰器
session的执行过程:
flask中session的实现机制:session默认存储到cookie中,默认不安全。如果公司内部访问的小项目一般也没有问题。
*也可以设置将session存储到数据库中。但是需要操作:
权限和下一路径的装饰器,
def wrapper_logined(func):
def inner(request,*args,**kwargs):
#如果有session放行
if request.session.get('logined'):
return func(request,*args,**kwargs)
# 问题:当访问 添加店铺时,因为权限被限制,跳转到登陆页面,但登录完没有跳转到添加店铺的页面
else: #如果没有session跳转到登陆,同时用cookie记住所访问的路径
response = render(request,'store/login.html')
full_path = request.get_full_path() #获取没登录时想要跳转页面的路径
response.set_cookie('full_path',full_path) #记住路径
return response
return inner
2、使用装饰器
flask 使用cookie 和session
flask的cookie
1、设置cookie(和django基本相同),cookie一般是字符串,如果是中文,可以使用url编码或者base64编码,使用的使用再解码即可。
response对象.set_cookie(键,值,时间)
需要注意:
删除cookie之后,键还存在,内容为空,立马过期而已。并没有完全消失(flask和django都一样)
2、读取cookie
导入requst请求对象
from flask import request
request对象.cookies.get(键) #django的是COOKIES,大写
3、删除cookie
response对象.delete_cookie(键)
flask的session
session相关的配置
1、秘钥
flask中的session的值默认会存入cookie,所以需要先设置加密的秘钥,秘钥值任意。
如果没有设置密码,设置session会报错,如下:
2、过期时间
flask的session对应的cookie默认浏览器关闭就失效。可以通过配置修改。
1、在设置session的时候加上一句代码
这样session的有效期是31天
2、如果想自定义过期时间,可以通过设置完成
单位是秒
2、设置session , 和django相比,不需要request
session[键] = 值
3、读取session
session.get(键)
4、删除session
删除1个:session.pop(键)#删除之前需要判断存不存在不存在会报错
删除所有:session.clear()
5、flask中session的存储
参考网站:
https://www.cnblogs.com/52forjie/p/8282453.html
session默认存储到cookie中,默认不安全。如果公司内部访问的小项目一般也没有问题。
也可以设置将session存储到数据库中。但是需要操作:
1、安装flask-session
2、导入
from flask_session import Session
使用如下:
from flask import Flask, request, current_app, session
from flask_sqlalchemy import SQLAlchemy
from flask_session import Session
import os
app = Flask(__name__)
db = SQLAlchemy(app)
# 调试模式
app.config['DEBUG'] = True
# 数据库连接
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:root@10.10.9.197/mydb03'
# 打印sql语句
app.config['SQLALCHEMY_ECHO'] = True
# 项目根路径
app.config['BASE_DIR'] = os.path.dirname(os.path.abspath(__file__))
# 文件上传路径
app.config['FILE_UPLOAD_PATH'] = os.path.join(app.config.get('BASE_DIR'), 'static/media')
# session的配置:session的加密秘钥,键必须是固定名字,值随意
app.config['SECRET_KEY'] = 'sdfsdSDfi7kmnF'
# session的配置:session使用sqlalchemy存储
app.config['SESSION_TYPE'] = 'sqlalchemy'
# session的配置:sqlalchemy关联的核心对象
app.config['SESSION_SQLALCHEMY'] = db
# session的配置:session要保存的表名称
app.config['SESSION_SQLALCHEMY_TABLE'] = 'session'
# session的配置:持久保存 True表示保存31天 False表示浏览器关闭后就自动失效
app.config['SESSION_PERMANENT'] = True
# session的配置:加密
app.config['SESSION_USE_SIGNER'] = True
# session的配置:保存到session表中的值的前缀
app.config['SESSION_KEY_PREFIX'] = 'session:' # 保存到session中的值的前缀
# session的配置:关联app
Session(app)
# session的配置:创建表
db.create_all()
@app.route('/set_session')
def set_session():
session['s_k1'] = 'v1'
session['s_k2'] = 'v2'
return 'set_session...'
@app.route('/get_session')
def get_session():
s_k1 = session.get('s_k1')
print(s_k1)
return 'get_session...'
@app.route('/delete_session')
def delete_session():
# 判断
if 's_k1' in session:
# 删除一个cookie,如果cookie不存在会报异常,所以先判断
session.pop('s_k1')
# 清空session
session.clear()
return 'delete_session...'
if __name__ == '__main__':
app.run(debug=True)
注意:session的表创建需要调用db.create_all(),否则不会自动创建表。