一、
1、cookie的由来!!!
由于HTTP协议是无状态的,既每一次的请求都是独立的,他不会因为你之前来过,就记住你,所以每次浏览器去访问服务器的时候,都是一个全新的过程,之前的数据也不会保留,所以为了解决这个问题,cookie诞生了。
2、什么是cookie?
Cookie具体指的是一段小信息,他是服务器发送出来存储在浏览器一组键值对,下次访问浏览器时会自动携带这些键值对,以便服务器提取信息。简单来说就是,Cookie会在你访问服务器时给你一个标记,下一次你再来访问只要携带这个标记,就能够访问了。所以他只认标记,不认用户。用的最普遍的就是做登录系统。
3、Cookie的工作原理。
原理:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断是谁了。
4、查看cookie
Name 和 Value就是键值对
二、Djangoz中操作Cookie
1、获取cookie
request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
参数:
default:默认值
salt:加密盐
max_age:生命周期
2、设置cookie
ret = render (request,'html文件')
ret.set_cookie('key','value')
return ret
通过set_cookie,这样就对ret 设置了cookie。
参数:
key:键
value:值
max_age=None,超时时间
expires = None,超时时间,用于IE浏览器的
path='/':Cookie生效的路径,/表示根路径,他比较特殊。根路径的cookie可以被任何url页面访问。
domain = None,cookie生效的域名
secure= False:https传输
httponly = False:只能http协议传输,无法被JavaScript获取。(不是绝对的,底层抓包可以获取到,也可以被覆盖)
3、删除cookie
def logout(request):
rep = redirect("/login/")
rep.delete_cookie("key") # 删除用户浏览器上之前设置的cookie
return rep
4、Cookie版登录校验的示例
from django.shortcuts import render, redirect, HttpResponse
# 这是一个装饰器,封装了一个匹配cookie的功能
def login_required(fn):
def inner(request, *args, **kwargs):
if not request.COOKIES.get('is_login') == '1': # 获取cookie的键'is_login',判断它的值是不是1,如果不是就获通过path_info获取到域名之后的路径next
next = request.path_info # cookie匹配不上,就跳转到登录界面,不过这个登录界面拼接了路径。/login/?next={}'.format(next),
# 拼接的后缀就是为了能够确保,从哪个页面失败人后进入的登录界面,登陆成功后跳回对应的页面
return redirect('/login/?next={}'.format(next))
ret = fn(request, *args, **kwargs) # 如果匹配成功,就跳转到被装饰得页面。
return ret
return inner
# 这是一个登录函数
def login(request):
if request.method == 'POST': # 判断请求方法,是POST方法,执行下面的操作
user = request.POST.get('user')
pwd = request.POST.get('pwd')
if user == 'alex' and pwd == 'alexdsb': # 如果用户名和密码匹配成功了
next = request.GET.get('next') # 通过GET方法,获取next。
if next: # 如果next有值,说明不是直接进的登录界面,而是访问其他路径,没有成功,通过装饰器拼接了next跳转过来的
ret = redirect(next) # next有值,就跳到next这个路径下
else: # 如果next没有值,说明是直接进入的登录界面,登陆成功后,直接跳转到'/index/'界面
ret = redirect('/index/')
ret.set_cookie('is_login', '1', max_age=5) # 设置cookie值cookie('键','值','最大死亡时间')
return ret
return render(request, 'login.html')
@login_required
def home(request): # 被装饰器装饰的函数,
return HttpResponse('这是home页面')
@login_required
def index(request):
return render(request, 'index.html')
# 注销函数
def logout(request):
ret = redirect('/login/')
ret.delete_cookie('is_login') # 删除cookie之后,跳转回登录页面
return ret
三、Session
1、Session的由来
由于Cookie是存在浏览器上的,所以很不安全,随时可能被拦截和窃取,同时Cookie最大支持4096个字节,多了就没法存储了。这时,为了解决这个问题,提高cookie的安全性,有了Session。它能够支持更多的字节,并且把保存在服务器上,有较高的安全性。
由于HTTP是无状态的,所以服务器也不知道是谁再访问,所以就需要Cookie做桥接。给每个客户端的Cookie分配一个唯一的ID,这样用户在访问时,通过Cookie,服务器就知道来的认识谁。
2、Django中Session的用法
1、
# 获取、设置、删除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()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
# 会话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失效策略。
3、Session流程解析
3、Session版登录验证
from functools import wraps
def check_login(func):
@wraps(func)
def inner(request, *args, **kwargs):
next_url = request.get_full_path()
if request.session.get("user"):
return func(request, *args, **kwargs)
else:
return redirect("/login/?next={}".format(next_url))
return inner
def login(request):
if request.method == "POST":
user = request.POST.get("user")
pwd = request.POST.get("pwd")
if user == "alex" and pwd == "alex1234":
# 设置session
request.session["user"] = user
# 获取跳到登陆页面之前的URL
next_url = request.GET.get("next")
# 如果有,就跳转回登陆之前的URL
if next_url:
return redirect(next_url)
# 否则默认跳转到index页面
else:
return redirect("/index/")
return render(request, "login.html")
@check_login
def logout(request):
# 删除所有当前请求相关的session
request.session.delete()
return redirect("/login/")
@check_login
def index(request):
current_user = request.session.get("user", None)
return render(request, "index.html", {"user": current_user})
Session版登录验证
Session 版登录验证