django中session实现方式

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/shilei123456789666/article/details/78558323
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+对象的dict
session中存储字典
  ● 出问题
  ● session过期时间
  ● 清空session
  ● 删除session没讲
  ● session购物车
python setup.py sdist upload -r pypi python setup.py register sdist upload
cookie
  ● 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'

      ○ redis
static
  ● 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、存放数据到session
request.session['some_id'] = some_id
2、从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 SessionStore
sessionStore = 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;
# 读取保存的session
from django.contrib.sessions.models import Session
session = 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


展开阅读全文

没有更多推荐了,返回首页