Django-Cookie-Session
一、cookie介绍
Cookie的由来:
因为HTTP协议是无状态的,也就是说每次请求都是独立的,它的执行情况和结果都与前面的请求和之后的请求都没有直接关系,不会被前面的请求直接影响,也不会直接影响后面的请求
什么是Cookie:
Cookie是浏览器技术,具体指的是一小段信息,是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器就会自动携带这些键值对,让服务器提取有用信息。
Cookie原理:
当浏览器访问服务端时,带着一个空的Cookie,并由服务器产生cookie内容给浏览器,浏览器收到后保存在本地,当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容判断这是 “谁” 了。
Cookie与HTTP头:
Cookie是通过HTTP请求和响应头在客户端和服务端传递的:
-
Cookie:请求头,客户端发送给服务端
-
格式:
-
请求头—>
Cookie:k1=v1; k2=v2
多个cookie用分号隔开 -
响应头:一个Cookie对象对应一个Set-Cookie
Set-Cookie: Set-Cookie: k1=v1 Set-Cookie: k2=v2
-
二、Django操作Cookie
Ctrl + Shift + Del :清除页面缓存和cookie。
设置Cookie:
rep = render(request, 'index.html')
rep.set_cookie('key', 'value')
rep.set_signed_cookie('key', 'value')
"""
参数:
key:--------------键
value:------------值
max_age=None:-----超时时间,秒为单位,默认是None,延续到浏览器关闭。
expires=None:-----超时时间,datetime类型,到这个日期就失效。
path='/':---------cookie的生效路径,/ 表示根路径,可以被任何url的页面访问
domain=None:------cookie生效的域名,默认None只能由设置它的站点读取。
secure=False:-----如果设置为True,浏览器将通过HTTPS来回传cookie。
httponly=False:---只能是http协议传输,无法被JavaScript获取
"""
获取Cookie:
request.COOKIES['key']
request.COOKIES.get('key')
request.get_signed_cookie('key', default=RAISE_ERROR, salt='', max_age=None)
"""
参数:
default:-----默认值
salt:--------加密盐
max_age:-----后台控制过期时间
"""
删除Cookie:
def quit(request):
rep = redirect('login')
rep.delete_cookie('name') # 删除用户浏览器上之前设置的name cookie值
return rep
Cookie版登陆校验示例:
from django.shortcuts import render, redirect
# 装饰器,判断cookie是否正确
def login_check(func):
def inner(request, *args, **kwargs):
login_id = request.COOKIES.get('is_login')
if login_id == 'True':
ret = func(request, *args, **kwargs)
return ret
else:
return redirect('login')
return inner
# 登录视图
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
name = request.POST.get('uname')
pwd = request.POST.get('pwd')
if name == 'xiaoyang' and pwd == '123':
rep = redirect('index')
rep.set_cookie('is_login', 'True')
return rep
else:
return redirect('login')
@login_check
def index(request):
return render(request, 'index.html')
# 退出删除cookie
@login_check
def quit(request):
rep = redirect('login')
rep.delete_cookie('is_login') # 删除用户浏览器上之前设置的name cookie值
return rep
三、session
Session是服务端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独有的session对象,并且该对象对应者该用户的资源,以一条记录的形式存在服务端,当浏览器带着session再次访问服务器时,服务器会取出session去查找对应的资源给用户。
因为资源(如同cookie一样的键值对)是放在服务端的,浏览器缓存到的只是一串字符串,并不是如同cookie一样有标志性的信息,所以相对而言比较安全
四、Django操作session
设置值:
1、生成了——>session_id:随机字符串
2、在cookie里面加上了一个键值对——>session_id:随机字符串
3、将用户的数据进行加密,并保存到django-session
表里面。
request.session['key'] = 'value'
request.session.setdefault('key', 'value') # 存在则不设置
获取值:
1、从cookie里面拿出session_id:xxxx
这个随机字符串
2、去django-session
表里面查询到对应的数据
3、反解加密的用户数据,并获取用户需要的数据
request.session.get('key') # key的值
request.session.keys() # 所有键
request.session.values() # 所有值
request.session.items() # 所有键值对
session_key = request.session.session_key # 获取sessionid的值,也就是随机字符串
request.session.exists("session_key") # 检查会话session的key在数据库中是否存在
删除值:
del request.session['key'] # 删除key对应的值,表里同步删除
request.session.delete() # 删除当前会话的所有session数据
request.session.flush() # 常用-清空所有cookie---删除session表里的这个会话的记录,
request.session.clear_expired() # Session失效日期小于当前日期的数据删除
设置会话Session和Cookie的超时时间
request.session.set_expiry(value)
# 如果value是个整数,session会在些秒数后失效。
# 如果value是个datatime或timedelta,session就会在这个时间后失效。
# 如果value是0,用户关闭浏览器session就会失效。
# 如果value是None,session会依赖全局session失效策略。
Session版登录校验:
from django.shortcuts import render, redirect
# 装饰器,判断session获取值是否正确
def login_check(func):
def inner(request, *args, **kwargs):
login_id = request.session.get('is_login')
if login_id == 'True':
ret = func(request, *args, **kwargs)
return ret
else:
return redirect('login')
return inner
# 登录判断和session设置
def login(request):
if request.method == 'GET':
return render(request, 'login.html')
else:
name = request.POST.get('uname')
pwd = request.POST.get('pwd')
if name == 'xiaoyang' and pwd == '123':
request.session['is_login'] = 'True'
return redirect('index')
else:
return redirect('login')
@login_check
def index(request):
return render(request, 'index.html')
# 退出登录,浏览器和服务端删除session
@login_check
def quit(request):
request.session.flush()
return render(request, 'login.html')
五、Django中的session配置
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' # 引擎
5. 加密Cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
其他公用设置项:
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_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)
本文来自博客园,作者:Mr-Yang`,转载请注明原文链接:https://www.cnblogs.com/XiaoYang-sir/articles/14929667.html