一、cookie session token
1 cookie:客户端浏览器上的键值对 2 session:存在服务端的键值对 3 token: 服务端签发的加密字符串 (加密的键值对,如果放在客户端浏览器上,它就叫cookie) 比如: head.{name:lqz,age:18}.eseetsweasdca base64加码后变成: asdfasfd.asdfasdf.asdfasdfaeraew 后端校验: 用这个token去查我的账户余额,向银行发请求,银行校验通过,是银行给你的,---》返回你的余额 比如:head.{name:lili,age:18}.eseetsweasdca 服务端可以匹配上,允许访问 eseetsweasdca的生成跟{name:lili,age:18}对应的 但是head.{name:egon,age:18}.eseetsweasdca name变了后服务端就匹配不成功了
二、django中cookie的使用
1.知识储备
# 0 会话跟踪,会话保持 # 1 cookie规范 -记住:当前网站在浏览器上cookie个数和大小有限制 -在服务端朝响应头里写cookie,到浏览器后会读出来,把k=v k=v存到浏览器里,下次浏览器再发送请求,浏览器会把放在浏览器里的cookie自动包装到http请求中去,
之后到了django框架,解析http把cookie放到字典里,jdango矿机会把所有的k v转到request.COOKIE字典里,在字典里就可以取出来了 -Cookie大小上限为4KB; -一个服务器最多在客户端浏览器上保存20个Cookie; -一个浏览器最多保存300个Cookie; # 2 django中操作cookie -增:obj.set_cookie('key','value') -删: obj.delete_cookie('key') # 实质是设置过期 -查: request.COOKIES.get('key') -改: obj.set_cookie('key','value1') # 3 带签名的cookie(加盐,加密) -增:obj.set_signed_cookie('name','lili','123') -删: obj.delete_cookie('name') # 实质是设置过期 -查: request.get_signed_cookie('name',salt='123') -改: obj.set_signed_cookie('name','guo','1234')
2.普通版
urls.py略
views.py
from django.shortcuts import HttpResponse def cookie_test(request): # 浏览器向我这个地址发一个请求,就在浏览器写入 name = zhangsan obj=HttpResponse('ok') obj.set_cookie('name','zhangsan') # 写入到浏览器了,在http响应头里:cookie: name=zhangsan obj.set_cookie('age','19') # 写入到浏览器了,在http响应头里:cookie: age=19 return obj def get_cookie(request): print(request.COOKIES) print(request.COOKIES.get('name')) return HttpResponse('我拿了你传过来的cookie') def delete_cookie(request): obj=HttpResponse('我删掉了你 name 这个cookie ') obj.delete_cookie('name') return obj
3.加盐加密版
urls.py略
views.py
def set_cookie(request): obj = render(request, 'index.html') obj.set_signed_cookie('name', 'lili', 'aaaa') #增 改 obj.delete_cookie('name')#删 return obj def get_cookie(request): print(request.COOKIES.get('name')) #查 print(request.get_signed_cookie('name',salt='123'))#查 return HttpResponse('获取成功')
三、django中session的使用
1.知识储备
1 session是存在于服务端的键值对 2 同一个浏览器不允许登录多个账户,不同浏览器可以登录同一个账户 3 session的使用(必须迁移数据) -增:request.session['name']=lqz -查:request.session['name']#查,没有会报错 -改:request.session['name']=egon -删:del request.session['name'] -设置过期时间:request.session.set_expiry(10) #防爬虫 4 session的其它使用 -request.session.setdefault('k1',123)#有不改,没有新增 -request.session.get('name',None)#查,没有不会报错 -del request.session['k1'] #删 -request.session.keys() -request.session.values() -request.session.items() -request.session.session_key # 获取那个随机字符串,django_session表中session_key字段 -request.session.clear_expired() # 清除过期的session -request.session.exists("session_key") # 判断这个随机字符串(session_key字段),有没有数据 -request.session.delete() # 删除所有的值,django_session表中删除当前登录者的这条记录 -request.session.flush() # 干了request.session.delete()这个事后,把cookie设置为过期
2.代码views.py
Django中使用session时,做的事:
# 生成随机字符串
# 写浏览器cookie -> session_id: 随机字符串
# 写到服务端session:
# {
# "随机字符串": {'user':'alex'}
# }
# 设置session # django框架默认,把session信息存到数据库中了,django_session表 # 先迁移数据库 def session_set(request): # request.session是个字典 # 写了下面那一句话,干了如下几件事 ''' # 一个浏览器,一个随机字符串 1 生成一个随机字符串asdfasdf,把随机字符串和name=lqz数据加密存到django_session表中(加密用的就是配置里SECRET_KEY里生成的随机密钥) 2 会把这个随机字符串放到cookie中 obj.set_cookie('sessionid',asdfasdf) ''' request.session['name'] = 'lqz' request.session['age'] = 19 return HttpResponse('session写入了') def session_set2(request): request.session['name'] = 'egon' request.session['xx'] = 'xx' return HttpResponse('session写入了') def session_get(request): # name=request.session.get('name') #用get查如果没有不会报错,[]取会报错 # print(name) # print(request.session.keys()) # print(request.session.values()) # print(request.session.items()) print(request.session.session_key) return HttpResponse('获取到了session')
四、
def set_cookie(self, key, value='', max_age=None, expires=None, path='/', domain=None, secure=False, httponly=False) # key # value # max_age:传个数字,以秒计,过期时间,有默认值 (5天后过期:60*60*24*5) ---了解 # expires:传时间对象,date=datetime.timedelta() # path:默认 / 表示当前域下的所有路径 http://127.0.0.1:8000/lqz/dfd/ # domain:设置在哪个域下有效 # secure:是否Https传输cookie # httponly:cookie只支持http传输 1. 数据库Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认) 2. 缓存Session 这样速度快 SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置 3. 文件Session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() 4. 缓存+数据库 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
# 缓存中用pickle存是二进制的形式,用json是明文,不安全,但也可以把它转成二进制形式或加密
5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用设置项: SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)***记住,可以写成60*60*24*14别人容易看清 ---了解 SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认) SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
代码关于path:
from django.shortcuts import render, HttpResponse, redirect def set_cookie(request): print(request.session) obj = render(request, 'index.html') # obj.set_signed_cookie('name', 'lqz', '123',path='/lqz/') obj.set_cookie('name', 'lqz', path='/lqz/') #只有在朝跟路径后面加 着/lqz/发请求才会携带 cookie return obj