Loading

Django框架之Cookie和Session

【一】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

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()
posted @ 2024-03-25 18:04  HuangQiaoqi  阅读(5)  评论(0编辑  收藏  举报