cookie
客户端浏览器上的一个文件,以键值对的形式存储,如{“user”:“dacehgnzi”}
入门:实现一个简单的登录功能
views.py:
1 user_info = { 2 'dachengzi':{'pwd':'123456'}, 3 'root':{'pwd':'555555'}, 4 } 5 def login(request): 6 if request.method == 'GET': 7 return render(request,'login.html') 8 elif request.method == 'POST': 9 name = request.POST.get('username') 10 passwd = request.POST.get('passwd') 11 dic = user_info[name] 12 if not dic: 13 return render(request,'login.html') 14 elif dic['pwd'] == passwd: 15 res = redirect('/index/') 16 res.set_cookie('username',name) 17 return res 18 else: 19 return render(request, 'login.html') 20 def index(request): 21 #获取当前已经登录的用户 22 v = request.COOKIES.get('username') 23 if not v: 24 return redirect('/login/') 25 26 return render(request,'index.html',{'current_user':v})
想要往浏览器中添加cookie值,在跳转的时候set_cookie,想要获取cookie时就用request.COOKIE.get(''),
获取cookie值:
- request.COOKIES获得所有的cookie
- request.COOKIES['cookie名称']
- request.COOKIES.get('cookie名称')
往浏览器中写cookie:在给用户返回内容的时候不仅要把内容返回给用户,还要把cookie返回给用户
1.用一个变量,把要跳转赋值过去:response = render(requset,'返回的html')/redirect('返回的url')
2.设置cookie值:response = set_cookie('key','value')设置cookie,关闭浏览器失效
3.返回response:return response
我们来看一下set_cookie函数:
set_cookie(key,value,...) 参数: key, 键 value='', 值 max_age=None, 超时时间,多少秒之后失效
expires=None, 超时时间(IE requires expires, so set it if hasn't been already.),具体到某一个时间 import datetime
current_date = datetime.datetime.utcnow()
current_date = current_date + datetime.timedelta(seconds=5)
response.set_cookie('username',name,expires = current_date)
path='/', Cookie生效的路径,/ 表示根路径,特殊的:根路径的cookie可以被任何url的页面访问 domain=None, Cookie生效的域名 secure=False, https传输 httponly=False 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖)document.cookie:js中获取cookie
案例:分页(通过cookie值设置每页显示多少条数据)
我们先下载一个jquery cookie这个js,这样就可以通过jQuery获得cookie值,和设置cookie:
html代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .pagination .page{ display: inline-block; padding:5px; background-color: seashell; margin:5px; } .pagination .active{ background-color: coral; } </style> </head> <body> <ul> {% for item in li %} {% include 'li.html' %} {% endfor %} </ul> <div> <select id="page_size" onchange="changePageSize(this)"> <option value="10">10</option> <option value="20">20</option> <option value="30">30</option> </select> </div> <div class="pagination"> {{ page_str|safe }} </div> <script src="/static/jquery-1.12.4.js"></script> <script src="/static/jquery.cookie.js"></script> <script> $(function () { v = $.cookie('per_page_count')获取cookie的值 if(v == undefined){ v = 10 } $("#page_size").val(v); }); function changePageSize(ths){ var v = $(ths).val() $.cookie('per_page_count',v);设置cookie的值 location.reload() } </script> </body> </html>
当然在这里面,我们也可以通过和django中cookie的一样的参数去设置url和过期时间
我们是上面的cookie值都是明文的,那我们如果用密文呢?
在django中有一个方法set_signed_cookie()方法,使用了这个方法设置出来的cookie值就是加密的:
#加密,基于salt加密 request.get_signed_cookie('username','kangbazi', default=RAISE_ERROR, salt='asdfasd', max_age=None) 参数: default: 默认值 salt: 加密盐 max_age: 后台控制过期时间 #解密 request.get_signed_cookie('username',salt='asdfasd')
salt的值要对应上才能解密
Session
cookie的缺点:
我们js可以获取然后修改,这时候我们用户再访问就登录不上了
如果我们把一些敏感信息放在cookie中,人家就可以看到。就会造成信息泄露
所以基于Cookie做用户验证的时候不建议把敏感信息存储在cookie中
cookie的优点:
把存储数据的压力放在每个人的电脑上,减轻了服务器的压力
1.Session原理
cookie是保存在用户浏览器端的键值对
session是保存在服务器端的键值对,session 依赖于 cookie。
用户来请求,登录之后给他生成一个随机字符串,在服务器上保存,放置一个字典保存当前用户的信息
入门:
views.py:
1 from django.shortcuts import render,HttpResponse,redirect 2 3 # Create your views here. 4 def login(request): 5 if request.method == 'GET': 6 return render(request,'login.html') 7 elif request.method == 'POST': 8 user = request.POST.get('user') 9 pwd = request.POST.get('passwd') 10 if user == 'root' and pwd == '123': 11 #生成随机字符串 12 #写到用户浏览器cookie 13 #保存的到session中 14 #在随机字符串对应的字典中设置相关的内容 15 request.session['username'] = user 16 request.session['is_login'] =True 17 return redirect('/index/') 18 else: 19 return render(request,'login.html') 20 def index(request): 21 #获取当前用户的随机字符串 22 #根据随机字符串获取对应的信息 23 if request.session['is_login']: 24 return HttpResponse(request.session['username']) 25 else: 26 return HttpResponse('去登录去')
首先我们运行的时候要先生成数据库,makemigrations,migrate,然后再去执行,因为session是存储在数据库中的
session操作:
# 获取、设置、删除Session中数据 request.session['k1']没有就报错 request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1']删除k1 # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 用户session的随机字符串 request.session.session_key # 将所有Session失效日期小于当前日期的数据删除,把数据库中超过超时时间的数据都删除 request.session.clear_expired() # 检查 用户session的随机字符串 在数据库中是否 request.session.exists("session_key") # 删除当前用户的所有Session数据 request.session.delete("session_key")
# 当登录的用户点注销的时候就可以用这句
request.session.clear()就相当于reqeust.session.delete(request.session.session_key)
# 在django中默认的超时时间为两周,我们可以通过下面的重新设置超时时间 request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效。 * 如果value是个datatime或timedelta,session就会在这个时间后失效。 * 如果value是0,用户关闭浏览器session就会失效。 * 如果value是None,session会依赖全局session失效策略。
settings.py:
a. 配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)
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,默认修改之后才保存(默认)
上面我们的 session 是放置在数据库中,在django中,还可以把session存放在其他的地方:
- 数据库(默认)
- 缓存
- 文件
- 缓存+数据库
- 加密cookie
放在缓存中:
settings.py
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() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T
缓存+数据库Session
数据库用于做持久化,缓存用于提高效率 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
加密cookie Session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎