HTTP 本身是无状态的,两次请求之间没有连续性,服务器无法知晓后续请求是不是来自同一个人。 这种状态上的缺失由会话(session)弥补。会话是位于浏览器和 Web 服务器之间的半永久性双向通信。
cookie 和 session
其中cookie是根本,Session是高级实现(session也是基于cookie)
其目的:
a) 在同一个浏览器的多次请求将可以存储数据。
b) 严格区分浏览器。
cookie: 客户端浏览器上的键值对
session: 存在服务端的键值对
token: 加密的键值对,如果放在客户端浏览器上,它就叫cookie,服务端签发的加密字符串,如果在app上就叫token
cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息
a) 当前网站在浏览器上cookie个数和大小有限制
b) cookie大小上限为4KB
c) 一个服务器最多在客户端浏览器上保存20个cookie
d) 一个浏览器最多保存300个cookie
服务器端脚本在浏览器端存储数据的一种技术
a) cookie会话数据存储在浏览器端
b) 浏览器在每次请求服务器程序时,会将该服务器所存储的cookie,携带到服务器端
c) 究竟存储那些数据由服务器决定
def cookie_set(request):
# 浏览器向我这个地址发一个请求,就在浏览器写入 name = '王重阳'
obj = HttpResponse('设置cookie')
obj.set_cookie('name','王重阳') # 写入到浏览器了,在http响应头里: cookie: name='王重阳'
obj.set_cookie('age','39') # 写入到浏览器了,在http响应头里:cookie: age=39
return obj
# 设置cookie的其他参数
max_age: 传数字,以秒计,过期时间,有默认值(5天后过期:60*60*24*5)
expires: 传时间对象,date=datetime.timedelta()
path: 默认/表示当前域下的所有路径 http://127.0.0.1:8000/newweb/
domain: 在那个域下有效
secure: 是否Https传输cookie
httponly: cookie只支持http传输
def cookie_get(request):
print(request.COOKIES)
print(request.COOKIES.get('name'))
return HttpResponse('获取cookie')
def cookie_delete(request):
obj = HttpResponse('删除指定cookie ')
obj.delete_cookie('name')
return obj
# django中操作cookie
增: obj.set_cookie('key','value')
删: obj.delete_cookie('key') # 设置过期
查: request.COOKIES.get('key')
改: obj.set_cookie('key','value1')
# 带签名的cookie(加盐,加密)
增: obj.set_signed_cookie('key','value','密钥')
删: obj.delete_cookie('key') # 设置过期
查: request.get_signed_cookie('key',salt='密钥')
改: obj.set_signed_cookie('key','value1','密钥')
1、存在于服务端的键值对
2、同一个浏览器不允许登录多个账户,不同浏览器可以登录同一个账户
增: request.session['key']=value
查: request.session['key']
改: request.session['key']=value1
删: del request.session['key']
设置过期时间: request.session.set_expiry(10)
# 以下6个用法跟字典使用方法一样
request.session.setdefault('key',value)
request.session.get('key',None)
del request.session['key']
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() # 删除所有的值,django_session表中删除当前登录者的这条记录,并把cookie设置为过期
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir()
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
SESSION_COOKIE_AGE = 1209600 # session的cookie失效日期(2周)(默认)
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,默认修改之后才保存(默认)