【一】Cookie与Session介绍
【1】早期的网站
- 早期的很多网站可能都没有保存用户功能的需求,所有用户访问的返回结果都是一样的,如新闻,博客文章等等...
- 但是互联网发展至今,已经有绝大多数网站,在你登录后反馈的页面和不登录反馈的页面已经是不一样的了,这些网站就用到了保存用户登录信息的技术
【2】Cookie
- 服务器保存在客户端浏览器上的信息都可以称之为Cookie
- 指代服务端希望客户端保存起来的数据、
- 它的表现形式一般都是K:V键值对,可以有多个
【3】Session
- 保存在服务器上的信息都可以称之为Session
- 他指代服务端保存的跟用户信息相关的数据
- 他的表现形式也是KV键值对,键和值都会会以加密的形式存储到一张表里
【4】总结
- cookie就是保存在客户端浏览器上的信息
- session就是保存在服务端上的信息
- session是基于cookie工作的(其实大部分的保存用户状态的操作都需要使用cookie)
【二】Django操作Cookie
- cookie是服务端希望浏览器保存下来的内容,但是浏览器也有权利不保存,
- 这样浏览器就无法保存用户登录信息
【1】视图返回值变形
- 为了方便对Cookie的方便,需要将视图函数的返回值进行小变形
obj = HttpResponse()
return obj
obj1 = render()
return obj1
obj2 = redirect()
return obj2
【2】设置cookie
set_cookie
obj = HttpResponse()
obj.set_cookie(key,value)
return obj
【3】获取cookie值
COOKIES.get()
request.COOKIES.get(key)
【4】设置过期时间
obj = HttpResponse()
obj.set_cookie(key,value,max_age=5)
# 设置超时时间 5s 到期
return obj
【5】注销cookie
obj = HttpResponse()
obj.delete_cookie(key)
return obj
【6】登录功能小案例
# 登录认证装饰器
# tag_url是获取当前用户想要进入的页面
def login_auth(func):
def inner(request, *args, **kwargs):
if not request.COOKIES:
tag_url = request.get_full_path()
return redirect(to=f'/app1/login/?next={tag_url}')
res = func(request, *args, **kwargs)
return res
return inner
# 登录函数
# 这里通过重定向到tag_url就可以进入到用户想要的界面
def login(request):
from .lib.Form import LoginForm
form_obj = LoginForm()
if request.method == 'POST':
form_obj = LoginForm(request.POST)
if form_obj.is_valid():
tag_url = request.GET.get('next')
print(tag_url)
username = form_obj.cleaned_data.get('username')
obj = redirect(to=tag_url)
obj.set_cookie(key='username', value=username)
return obj
return render(request, 'login.html', locals())
# 装上装饰器的函数
@login_auth
def show_book(request):
from utils.page import Pagination
book_obj = models.Book.objects.all()
current_page = request.GET.get('page', 1)
all_count = book_obj.count()
page_obj = Pagination(current_page=current_page, all_count=all_count, per_page_num=3)
page_queryset = book_obj[page_obj.start:page_obj.end]
return render(request, 'book.html', locals())
【三】Django操作Session
- session数据是保存在服务端的,给客户端返回的是一个随机的字符串
- sessionid:随机字符串
【1】设置session
request.session['key'] = value
# 内部发生的事情
1.产生一个随机的字符串
2.在某个地方存储字符串与加密数据的对应关系
3.将产生的随机字符串也发给浏览器一份,并且让它保存
【2】获取session
request.session.get('key')
# 内部发生的事情
1.获取浏览器保存的随机字符串
2.将获取到的随机字符串与数据库中的字符串进行比对
3.如果有对应的数据,就将其以字典的形式封装到request.session中,没有就是None
【3】设置/获取多个session值
- 当同一个IP地址且同一个浏览器给session设置多个值时,存在数据库中的数据仍然只有一条
- 但是在取session的时候,可以通过
request.session
对象获取到设置的多组键值对
【4】设置过期时间
# 设置过期时间
request.session.set_expiry(value)
# 如果value是个整数,session会在些秒数后失效。
# 如果value是个datatime或timedelta,session就会在这个时间后失效。
# 如果value是0,用户关闭浏览器session就会失效。
# 如果value是None,session会依赖全局session失效策略。
# 默认的过期时间为14天
【5】情况session
# 只删除服务端的
request.session.delete()
# 客户端 服务端都删除的
request.session.flush()