Django---Django中使用COOKIE和SESSION
发布时间:2020-12-20 10:48:02 所属栏目:Python 来源:网络整理
导读:Django---Django中使用COOKIE和SESSION 一丶Cookie cookie的由来 # HTTP协议是无状态的。# 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应
Django---Django中使用COOKIE和SESSION一丶Cookiecookie的由来# HTTP协议是无状态的。 # 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不会直接影响后面的请求响应情况。 # 对服务器来说,每次的请求都是全新的。 # 状态可以理解为客户端和服务器在某次会话中产生的数据,那无状态的就以为这些数据不会被保留。会话中产生的数据又是我们需要保存的,也就是说要“保持状态”。 什么是cookie# Cookie具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息 cookie原理# cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了 Django操作cookie### 获取Cookie request.COOKIES['key'] request.COOKIES.get('key') # 普通的cookie request.get_signed_cookie('key',default=RAISE_ERROR,salt='',max_age=None) #加密的cookie ### 设置Cookie,都需要一个HttpResponse rep = HttpResponse(...) rep = render(request,...) rep = redirect(request,...) rep.set_cookie(key,value,...) # 设置普通的cookie rep.set_signed_cookie(key,salt='加密盐',...) # 设置加密后的cookie ### set_cookie() 参数说明: key,键 value='',值 max_age=None,超时时间 expires=None,超时时间(IE requires expires,so set it if hasn't been already.) path='/',Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 domain=None,Cookie生效的域名 secure=False,https传输 httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖) ### 删除Cookie def logout(request): rep = redirect("/login/") #得到HttpResponse对象 rep.delete_cookie("user") # 删除用户浏览器上之前设置的user的cookie值 return rep cookie模拟登录###PS: cookie 关闭浏览器Cookie就失效. 存在本地浏览器上 ### cookie 流程: # 1. 服务端发送一个cookie信息 # 2. 本地浏览器保存,# 3. 发起其他请求时,携带cookie # 4. 服务器进行校验,从cookie获取一些信息,如:登录状态,记录用户浏览信息 ? 代码如下:?? from django.shortcuts import render from django.shortcuts import HttpResponse from django.shortcuts import redirect # 校验登录装饰器 def login_check(func): def inner(request,*args,**kwargs): # 得到cookie的登录状态值 ### 普通cookie login_status = request.COOKIES.get('login_status') ### '加盐'之后的cookie default='XX' 设置默认值,如果没有则会抛出异常 login_status = request.get_signed_cookie('login_status',default='',salt='sywdsb') print(login_status) # 判断cookie的登录状态值 if login_status != '1': returl=request.path_info # 获得 路径,不包ip和端口,还有参数,只获得根目录URL路径 print(returl) # 请求哪一个url,就登录到那个url对应的页面. return redirect(f'/login/?returl={returl}') ret = func(request,**kwargs) return ret return inner def login(request): error = '' if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'syw' and pwd == '213': retUrl=request.GET.get('returl') retUrl= retUrl if retUrl else '/index/' ret = redirect(retUrl) # 通过 HttpResponse对象 设置cookie ### 设置普通的cookie # max_age 超时时间,单位为秒,可做算数运算 # path 哪一个路径下可以访问 # secure 是否进行安全的HTTPS协议发送 # domain 生效的域名. 不写就是全域名生效 # httponly 只能是Http协议传输,不能通过js获取到到cookie,抓包除外. ret.set_cookie('login_status',1,max_age=5*20,path='/',secure=False) ### 设置'加盐'的cookie ret.set_signed_cookie('login_status','1',salt='sywdsb') return ret error = '帐号或密码错误~~' return render(request,'login.html',{'error': error}) def logout(request): # 打印cookie中的某个键的值 print(request.COOKIES.get('login_status')) # 通过 HttpResponse对象 删除cookie ret = redirect(to='/login/') ret.delete_cookie('login_status') return ret @login_check def index(request): return HttpResponse('欢迎进入index页面') @login_check def home(request): return HttpResponse('欢迎进入home页面') 二丶Sessionsession的由来Cookie虽然在一定程度上解决了“保持状态”的需求,但是由于Cookie本身最大支持4096字节,以及Cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是Session。 问题来了,基于HTTP协议的无状态特征,服务器根本就不知道访问者是“谁”。那么上述的Cookie就起到桥接的作用。 我们可以给每个客户端的Cookie分配一个唯一的id,这样用户在访问时,通过Cookie,服务器就知道来的人是“谁”。然后我们再根据不同的Cookie的id,在服务器上保存一段时间的私密资料,如“账号密码”等等。 总结而言:Cookie弥补了HTTP无状态的不足,让服务器知道来的人是“谁”;但是Cookie以文本的形式保存在本地,自身安全性较差;所以我们就通过Cookie识别不同的用户,对应的在Session里保存私密的信息以及超过4096字节的文本。 另外,上述所说的Cookie和Session其实是共通性的东西,不限于语言和框架。 Django中Session相关方法# 获取、设置、删除Session中数据 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1'] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() # 会话session的key request.session.session_key # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查会话session的key在数据库中是否存在 request.session.exists("session_key") # 删除当前会话的所有Session数据 request.session.delete() # 删除当前的会话数据并删除会话的Cookie。 request.session.flush() 这用于确保前面的会话数据不可以再次被用户的浏览器访问 例如,django.contrib.auth.logout() 函数中就会调用它。 # 设置会话Session和Cookie的超时时间 request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。 Session流程解析Session版登陆验证###ps: # session 在Django中默认存在数据库的一张表中,字段有:sessionID,加密之后的值,session超时时间 # session 依赖cookie ### session的流程: # 1.浏览器向服务发送请求,# 2.服务器设置session,并保存在服务端的上(以数据库,文件,缓存等形式保存) . 生成一个session_id .以键值对的形式{session_id:{'键':'值'}} # 3.服务器将sessionID发送给浏览器,这个sessionID是服务器生成的.并通过cookie保存浏览器本地 # 4.当其他页面提交请求时,携带新的sessionID. ? 代码如下:?? from django.shortcuts import render from django.shortcuts import HttpResponse from django.shortcuts import redirect # 校验登录装饰器 def login_check(func): def inner(request,**kwargs): # 得到cookie的登录状态值 ### 普通cookie # login_status = request.COOKIES.get('login_status') ### '加盐'之后的cookie default='XX' 设置默认值,如果没有则会抛出异常 # login_status = request.get_signed_cookie('login_status',salt='sywdsb') ### 获取session from django.conf import global_settings login_status = request.session.get('login') # 获得 session print(request.session.keys()) # 获取session的所有键 print(request.session.values()) # 获取session的所有值 print(request.session.session_key) # 获取存在服务端的sessionkey print(request.session.exists('vzzfcn0tocyna7afw5ydpmsdbk6u4on5')) # 判断某个session的key是否存在 ret= request.session.pop('aaa')# 随机删除一个session print(ret) # 删除 session为键名为'aaa'的并返回删除的值 request.session.clear() # 清除 session失效日期小于当前日期的数据 request.session.delete() # 删除所有的session request.session.flush() # 删除当前会话数据,并删除会话的cookie print(login_status) # 判断cookie的登录状态值 if login_status != '1': returl=request.path_info # 获得 路径,抓包除外. # ret.set_cookie('login_status',secure=False) ### 设置'加盐'的cookie # ret.set_signed_cookie('login_status',salt='sywdsb') ### 设置session request.session['login']='1' request.session['aaa']='aaa' return ret error = '帐号或密码错误~~' return render(request,{'error': error}) def logout(request): # 打印cookie中的某个键的值 print(request.COOKIES.get('login_status')) ### 删除 session request.session.delete() # 删除所有的session # 删除不了浏览器的sessionID(删除不了保存在浏览器上的cookie),只是删除session表中的session记录 request.session.flush() # 删除 浏览器的sessionID(也就是删除cookie),也删除session表中的记录,# 通过 HttpResponse对象 删除cookie ret = redirect(to='/login/') ret.delete_cookie('login_status') return ret @login_check def index(request): return HttpResponse('欢迎进入index页面') @login_check def home(request): return HttpResponse('欢迎进入home页面') Django中的Session配置### Django中默认支持Session,其内部提供了5种类型的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 = Fals# 是否关闭浏览器使得Session过期(默认) SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |