cookie和session
Posted zhufanyu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cookie和session相关的知识,希望对你有一定的参考价值。
cookie:
1. #保存在用户浏览器端的键值对,向服务端发请求时会自动携带。 2. 为什么要用cookie? # 我们现在做的登陆是有问题的,当我们使用登陆页面登陆的时候登陆成功会返回一个登陆成功的页面,而我们没有在不使用cookie的时候,我们可以是直接访问登陆成功的页面,不需要验证,为了解决这个问题我们应用的cookie 3.写一个cookie: # 在登陆页面登陆成功后写一个返回,在这个返回页面中设置一个cookie result = redirect('home') result.set_cookie('xxx','zfy') 4. 判断页面是否有这个cookie name=request.COOKIES.get('xxx') # 获取这个页面中的cookie
- cookie应用场景:
用户认证
投票
每页默认显示数据
- cookie应用场景:
session:
- session应用场景
用户认证
短信验证过期
权限管理
依赖cookie #是一种存储数据的方式,依赖于cookie,实现本质: 用户向服务端发送请求,服务端做两件事:生成随机字符串;为此用户开辟一个独立的空间来存放当前用户独有的值. 在空间中如何想要设置值: request.session['x1'] = 123 request.session['x2'] = 456 在空间中取值:那个页面需要就在那个页面获取 request.session['x2'] request.session.get('x2') 视图函数中的业务操作处理完毕,给用户响应,在响应时会 将随机字符串存储到用户浏览器的cookie中.
如果遇到页面多的时候每个都需要获取这样就会写很多的重复代码,所以可以写一个装饰器:
def auth(func): def inner(request,*args,**kwargs): name = request.session.get('name') if name: return render(request, 'home.html', {"name": name}) return func(*args,**kwargs) return inner
如果你在装饰器中没有获取值,没有进行模板渲染,在页面也可以获取:
<div class="container"> <div class="page-header"> <h1>这是首页 <small>欢迎{{ request.session.name }}登陆</small></h1> </div> </div> request.session.name --- 也可以获取到session中的值
- session应用场景
django和session相关的 配置
SESSION_COOKIE_NAME = "sessionid" #Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串 SESSION_COOKIE_DOMAIN = None #api.baidu.com /www.baidu.com/ xxx.baidu.com (那些域名可以访问) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径 SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False #是否关闭浏览器使得Session过期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存
- SESSION_COOKIE_NAME = "sessionid"
django中的session如何设置过期时间? (记)
SESSION_COOKIE_AGE = 1209600 # Session的 cookie失效日期(2周)
django的session默认存储在数据库,可以放在其他地方吗?
小系统:默认放在数据库即可. 大系统:缓存(redis)
文件
SESSION_ENGINE ='django.contrib.sessions.backends.file' SESSION_FILE_PATH = '/sssss/'
缓存(内存)
SESSION_ENGINE ='django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default' CACHES = {'default': {'BACKEND':'django.core.cache.backends.locmem.LocMemCache','LOCATION': 'unique-snowflake',}}
缓存(redis)
SESSION_ENGINE ='django.contrib.sessions.backends.cache' SESSION_CACHE_ALIAS = 'default' CACHES = { "default": {"BACKEND":"django_redis.cache.RedisCache", "LOCATION":"redis://127.0.0.1:6379", "OPTIONS": {"CLIENT_CLASS":"django_redis.client.DefaultClient", "CONNECTION_POOL_KWARGS":{"max_connections": 100} # "PASSWORD": "密码", } } } # 设置(添加&修
操作session
# 设置(添加&修改) request.session['x1'] = 123 request.session['x2'] = 456 # 读取 request.session['xx'] request.session.get('xx') # 删除 del request.session['xx'] request.session.keys() # 获取session的所有键 request.session.values() # 获取session的所有值 # 结果 ''' dict_keys(['name', 'id']) dict_values(['adrian', 2]) ''' request.session.items() # 获取session的所有键值对以元组形式 #结果 ''' dict_items([('name', 'adrian'), ('id', 2)]) ''' request.session.set_expiry(value) # 设置浏览器保存cookie的过期时间 value是一个数字(以秒计时) request.session.session_key # 获取cookie随机生成的字符串 # rr0nsqjmh3wxwogu2gyx381z1vza1qwa
强调:
session中的数据是根据用户相互隔离.
就是说session在每个用户使用时单独的开辟了一块空间进行存放数据,互不干扰
通过js设置cookie
document.cookie = 'k1=wy222;path=/' $.cookie('k1','wy222',{path:'/'}) # 注意:path不同会导致设置不同.
path的作用
/ ----- 当前网站中所有的URL都能读取到此值. "" ----- 只能在当前页面访问的到此数据. /index/ ------ 只能在/index/xxx 的网页中查看.
以上是关于cookie和session的主要内容,如果未能解决你的问题,请参考以下文章