django中session实现方式

来源:互联网 发布:ubuntu 断电无法启动 编辑:程序博客网 时间:2024/05/19 11:48
cookie  ● 客户端存储技术      ○ cookie是存在浏览器的      ○ 广告      ○ 获得cookies COOKIES 【字典】      ○ 所有的字典的操作get,items,['']  ● 如何写一个cookies      ○ response.set_cookie() 写cookie      ○ key,value      ○ 过期时间 (expires)如果过期就自动删除,不过期的话访问服务器的时候并且在同一路径下会自动携带cookie的值      ○ 回话结束 浏览器关了      ○ max_age = 60*10 10分钟      ○ path 路径 路径相同会自动携带 (path) path='/user/'      ○ 当你访问127.0.0.1:8000/user/*** 子路径也算      ○ 域名要相同  ● 什么时候会携带cookie      ○ cookie没有过期      ○ 相同path      ○ 相同域名  ● 悬浮广告  ● cookies的第一应用      ○ 保存商品的浏览记录(调整顺序和去重)  ● cookies小结      ○ cookies 所有对字典的操作都可以对cookie      ○ cookie的五个属性 key,value,expries,path,domain      ○ 从request.COOKIES获得cookie      ○ cookie的过期时间None(会话结束就删除。(浏览器关闭)),正数(多少时间过期)      ○ 从response.set_cookie存储cookie      ○ 能不能使用cookie保存用户的账号和密码?不行。(cookie不能存储敏感信息,而且存储大小和存储数量邮箱)  ● session(会话)      ○ 服务器的一种存储技术      ○ 加入购物车,免登陆      ○ 默认session会在数据库中有一张表      ○ request.session获得session  ● session详解      ○ session from django.contrib.sessions.backends.db import SessionStore      ○ session是基于cookie的      ○ 关键是sessionid 不重复![](https://i.imgur.com/4P326bw.png)      ○ 将对象转换成字符串(序列化)      ○ {'username':'admin','password':'admin'}      ○ session中不能存储自定义对象,如果存储需要转换成json对象  ● 对象是有什么组成的      ○ 父类的dict+本类的dict+对象的dictsession中存储字典  ● 出问题  ● session过期时间  ● 清空session  ● 删除session没讲  ● session购物车python setup.py sdist upload -r pypi python setup.py register sdist uploadcookie  ● cookie 在请求中传给服务器(Cookie: sex="\347\224\267"; age=10; name=django)  ● cookie 在响应头中传浏览器Set-Cookie: age=10; Path=/Set-Cookie: name=django; expires=Tue, 31-Oct-2017 01:26:37 GMT; Max-Age=600; Path=/Set-Cookie: sex="\347\224\267"; Path=/cookiedemo/  ● 什么传递给服务器cookie?      ○ 域名      ○ path      ○ 时间  ● request.COOKIES 字典,只要是浏览器发送的一般都认为是只读Session  ● sesssion基于cookie,服务器给每一个访问的浏览器唯一的编号(seesionid),下次访问的时候携带sessionid过来,服务器就知道你之前做了什么事情  ● session 服务端存储技术(django默认实现是基于数据库的)  ● settings中 INSTALL_APP中 'django.contrib.sessions',  ● 写一个demo,记住浏览器发送的所有的信息,然后显示给你  ● session的操作 类字典 SessionStore实例      ○ request.sesssion 获得session          ■ 例:uname = request.session.get('uname','如果没有返回这个自定义信息')          ■ uname = request.session['uname']      ○ request.session 初次给session里面赋值的时候就会创建session      ○ request.session['user']=user(序列化的)          ■ name = request.POST['uname']          ■ request.session['uname'] = name      ○ request.session.get('user','默认值') 获得user的值      ○ del request.sesssion['loginError'] 删除session中的某个值      ○ 获得sesssionkey request.sesssion.sessionkey      ○ 清空sesssion里面所有的数据 request.session.clear()      ○ 删除session,request.sesssion.flush() 删除sesssion,包括数据中的      ○ 设置过期时间,None(不过期),0(浏览器关闭过期)10000,时间,什么时间之后过期  ● demo      ○ 免登陆      ○ 登出 del request.session['user'] 重定向登录界面      ○ 加购物车(bug)(字典),基于session的判断有没有购物车创建购物车{}判断此商品在不在购物车之内在就+1,不在就添加到购物车,默认1再将购物车放到session中  ● django会在session改变的时候讲数据存储到数据库      ○ session['age']=10 首次添加      ○ sesssion['age']=20 算      ○ sesssion['cart']={'商品的唯一标示':{'goodsid':101,'colorId':101,'sizeId':sizeid},....}      ○ sesssion['cart']['商品的唯一标示']['sizeId']=200 这算不算改变?不算,因为字典对象没有发生改变,字典里面的字典发生了改变。      ○ request.sesssion.modified = True  ● 需要定时手动清空无效的session      ○ python manage.py clearsessions  ● 修改session的默认缓存方式      ○ 数据库 django.contrib.sessions.backends.db      ○ 文件SESSION_ENGINE='django.contrib.sessions.backends.file'SESSION_FILE_PATH=os.path.join(BASE_DIR,'cache')          ○ cache 内存SESSION_ENGINE='django.contrib.sessions.backends.cache'      ○ 双缓存 (内存+数据库),读取(先读内存,内存没有读取数据库,存到内存),写(先写内存再写数据库)SESSION_ENGINE='django.contrib.sessions.backends.cached_db'      ○ 基于cookie的SESSION_ENGINE='django.contrib.sessions.backends.signed_cookies'      ○ redisstatic  ● STATIC_URL = '/static/' 表示在访问静态资源的时候,url /static/资源名      ○ STATIC_URL是给浏览器看的  ● STATICFILES_DIRS 让服务器去哪里找静态资源        STATICFILES_DIRS=[            os.path.join(BASE_DIR,'abc'),            os.path.join(BASE_DIR,'static')        ]  ● 好处 304手动模拟static文件(基于浏览器缓存)  ● 响应头      ○ Cache-Control      ○ Last_Modified      ○ Set-Cookie  ● 请求头      ○ IfModifiedSince 会携带发给浏览器的修改时间      ○ Cookie      ○ referer(防盗链)盗下载链接  ● 让浏览访问我的时候,携带文件上一次修改的时间  ● 从请求中获得上一次修改的时间,  ● 和本地这个文件现在修改时间对比,如果一样,说明没修改。返回304,返回新文件内容redis  ● wget 下载,解压  ● ./configure(待定)  ● make 编译 (gcc)  ● make install  ● cd redis解压目录  ● redis-cli 判断是否安装成功  ● 配置环境变量  ● 配置自启(一)django有四中session实现方式1、数据库(database-backed sessions)2、缓存(cached sessions)3、文件系统(file-based sessions)4、cookie(cookie-based sessions)其中数据库方式是默认的也是默认就启用的,其实现方式实际上是通过django中间件实现的,配置在INSTALLED_APPS中的django.contrib.sessions。目前先使用数据库方式的session,其他以后继续补充,首先考虑改进为“缓存”。(二)django session使用基础1、存放数据到sessionrequest.session['some_id'] = some_id2、从session中读取存放的数据session.get('some_id', False)3、从session中将数据删除del request.session['some_id']4、让session过期request.session.set_expiry()5、在命令行访问sessin数据# 生成并保存session(利用SessionStore)from django.contrib.sessions.backends.db import SessionStoresessionStore = SessionStore()sessionStore["str"] = "hello"                  #  字串映射sessionStore["dict"] = {};                     #  可以定义多级的字典结构sessionStore["dict"]["key1"]="value1"sessionStore["dict"]["key2"]="value2"sessionStore.save();print(sessionStore.session_key);print(sessionStore.keys());session_key = sessionStore.session_key;# 读取保存的sessionfrom django.contrib.sessions.models import Sessionsession = Session.objects.get(pk=session_key)print(session.session_data);                 # 返回session的存储(加密过)print(session.get_decoded());                # 返回session的数据结构(加过解码)  print(session.expire_date);注意:(1)保存数据的使用使用的是SessionStore读取数据使用使用的是Session。(2)在使用多级字典时session["dict"]["key1"] = "something" django默认不会对多级对象进行保存,需要显示的使用代码 
request.session.modified = True