发展史

1.早期的时候,网站都没有保存用户功能的需求,所有用户访问网站返回的结果都是一样的,比如新闻、文章等网站!

2.但是,随着网站的发展,出现了一些需要保存用户信息的网站,比如:淘宝、京东、个人博客等!

3.以登录功能为例,如果不保存用户登录的信息,就意味着用户每次都需要重新登录网站,为此非常的麻烦。

4.为了解决上述的麻烦,便产生了cookie和session

1.cookie

1.1 什么是cookie

当用户第一次登录之后,浏览器会将您登录之后的用户名和密码保存到用户浏览器,让其保存在本地,之后再次访问网站的时候,浏览器会帮您自动的将保存的用户名和密码发送到浏览器,这样就省去了登录的操作!

装逼小技巧:当你点击浏览器的设置,在里面查找cookie权限时,选择不允许站点保存cookie时,以后该浏览器上需要用到记录用户状态(登录)的功能都无法实现了!

1.2 为什么要用cookie

为了减少每次登录网站都要登录的麻烦,减少用户每次操作都需要登录的操作(每次添加到购物车一下就需要登录将非常的麻烦)!

1.3 cookie的危害

早期这样将用户的信息保存在浏览器是有非常大的隐患的!其他人很容易在浏览器内看到你保存的用户名和密码,这样用户的信息就不安全了!

1.4 如何使用cookie

存储/添加/修改:
def set_cookies(request):
    resp = HttpResponse('set cookies is ok')
    resp.set_cookie('uuname', 'zhangyang', max_age=500,expires=500)
return resp
每一个响应对象对有一个set_cookies方法里面的参数分别是:key、value、max_age保存时间单位s,expires对于ie浏览器生效的保存时间
删除:
httpresponse.delete_cookie(‘key’)--删除指定key的cookie,如果key不存在,则什么也不发生
获取cookies:
​value = request.COOKIES.get('key’,'默认值‘)

利用cookie制作动态跳转登录

from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect

# 装饰器 实现功能是只有登录了之后才能访问到该页面,否则跳转到登录页面
def login_out(func):
    def wrapper(request,*args,**kwargs):
        target_url = request.get_full_path()
        # print(target_url)
        if request.COOKIES.get('username'):
            res=func(request,*args,**kwargs)
            return res
        else:
            # 此处的设计是为了动态的获取用户是从那个页面进行登录的,如何执行登录之后在跳转回该页面
            return HttpResponseRedirect('/login?next=%s'%target_url)
    return wrapper

# Create your views here.
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username=='zhang' and password=='123':
            # 获取用户是从哪个页面登录的url
            url = request.GET.get('next')
            if url:
                # 获取到了则登录成功跳转到该页面
                obj = HttpResponseRedirect(url)
            else:
                # 没有获取到则跳转到默认页面
                obj = HttpResponseRedirect('/login')
            obj.set_cookie('username','zhang')
            return obj
    return render(request,'login.html')

@login_out
def home(request):
    return HttpResponse('这是登录之后的home页面')

@login_out
def index(request):
    return HttpResponse('这是登录之后的导航页')

2. session

2.1 什么是session

为了解决cookie产生的危害,便产生了session,session是借助cookie进行工作的!当用户将登录的信息返回到服务器,服务器会将用户的信息保存在服务器内并返回一个随机的字符串给浏览器,该字符串与这个用户的信息相对应!浏览器将这个随机字符串以cookie的形式保存在浏览器本地,以后每次需要访问网站的时候,浏览器就会把这个cookie的随机字符串返回给服务器,服务器匹配与之对应的用户信息返回给前端!

2.2 为什么要有session

为了解决cookie所存在的安全隐患,更好的保护用户的隐私。

2.3 如何使用session

session对象是一个类似于字典的对象,可以用类似字典的方式进行操作--session能够存储字符串、整形、字典、列表等

1.保存session的值到服务器
def set_session(request):
    request.session['uname'] =  'wwc'   ---存储session的写法
"""
    内部发送了那些事
        1.django内部会自动帮你生成一个随机字符串
        2.django内部自动将随机字符串和对应的数据存储到django_session表中
            2.1先在内存中产生操作数据的缓存
            2.2在响应结果django中间件的时候才真正的操作数据库
        3.将产生的随机字符串返回给客户端浏览器保存
"""
return HttpResponse('set session is ok')
存储时会报错时,可能是因为没有执行数据库迁移命令,因为session是保存在服务端的,它需要django中有一张默认的django_session表

2.获取已经存储的session值
def get_session(request):
    value = request.session.get['uname',默认值]
"""
    内部发送了那些事
        1.自动从浏览器请求中获取sessionid对应的随机字符串
        2.拿着该随机字符串去django_session表中查找对应的数据
        3.
            如果比对上了 则将对应的数据取出并以字典的形式封装到request.session中
            如果比对不上 则request.session.get()返回的是None
"""
return HttpResponse('session value is %s' % value)

3.删除session
del request.session['key']
request.session.delete()  # 只删服务端的 客户端的不删
request.session.flush()  # 浏览器和服务端都清空(推荐使用)

4.设置session的保存时长(默认是2周)
法一:
	request.session.set_expiry()
	括号内可以放四种类型的参数
	1.整数		多少秒
	2.日期对象	指定日期就失效
	3.0		一旦当前浏览器窗口关闭立刻失效
	4.不写		失效时间就取决于django内部全局session默认的失效时间
法二:
	在setting.py中添加配置项SESSION_COOKIE_AGE=60*60*24*7*2
	或者设置SESSION_EXPIRE_AT_BROWSER_CLOSE = True---表示只要浏览器关闭时,session就失效(默认为Flase)

5.其他需要了解的知识点
session是保存在服务端的 但是session的保存位置可以有多种选择
	1.MySQL
	2.文件
	3.redis
	4.memcache
	...

django_session表中的数据条数是取决于浏览器的
	同一个计算机上(IP地址)同一个浏览器只会有一条数据生效
	(当session过期的时候可能会出现多条数据对应一个浏览器,但是该现象不会持续很久,内部会自动识别过期的数据清除 你也可以通过python3 manage.py clearsessions清除)
	主要是为了节省服务端数据库资源

小练习:如何利用session完成动态跳转登录