cookie与session

cookie与session简介

早期的web不需要什么用户注册,所有用户都给一样的界面,不需要什么状态保存,随着互联网的发展,我们很多web框架的应用需要保存用户的状态。

cookie
保存在客户端与用户状态相关的信息
session
保存在服务端与用户状态相关的信息
ps:session的工作需要依赖于cookie
补充:浏览器有资格拒绝保存服务端发送过来的cookie数据(在浏览器设置中拒绝保存cookie)

django操作cookie

要想操作cookie就不能直接返回HttpResponse对象 必须先用变量接收

obj1 = render()
return obj1

request.COOKIS 里携带了cookis键值对

def login_func(request):
    res = HttpResponse('登录')
    res.set_cookie('name','jason') # 让浏览器保存键值对
    return res

def home_func(request):
    print(request.COOKIES.get('name'))  # 拿到键值对
    return HttpResponse('主页')

cookie写用户登录功能

def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'tank' and password == '123':
            obj = redirect('/home/')  # 重定向
            obj.set_cookie('name',username) # 让重定向的结果保存一个cookie
            return obj
    return render(request, 'loginPage.html')


def home_func(request):
    if request.COOKIES.get('name'):  # 判断cookie内有没有数据
        return HttpResponse('主页')
    else:
        return redirect('/login/')

问题是如果有很多功能都需要登录后可以访问代码重复率太高,考虑使用装饰器
def login_auth(func_name):
    def inner(request,*args,**kwargs):
        if request.COOKIES.get('name'):
            res = func_name(request,*args,**kwargs)
            return res
        return redirect('/login/')
    return inner
缺点是无法返回到用户没有登录前的那个页面
print(request.path) # 只获取路由
print(request.path_info)  # 只获取路由
print(request.get_full_path()) # 可以获取到路由和?后面携带的数据
利用request_path_info 拿到用户登录之前的路由并携带给登录页面,在登录功能函数内 拿到该路由 如果有值则跳转到该路由 没有值跳转回主页


# Create your views here.
def login_auth(func_name):
    def inner(request, *args, **kwargs):
        print(request.path_info)
        ret = request.path_info  # 获取到用户跳转到登陆之前的路由名
        if request.COOKIES.get('name'):
            res = func_name(request, *args, **kwargs)
            return res
        return redirect('/login/?next=%s' % ret)  # 没登录跳转到登录页面并把之前网址的路由携带过去

    return inner


def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'tank' and password == '123':
            target_path = request.GET.get('next')
            if target_path:
                obj = redirect(target_path)
            else:
                obj = redirect('/home/')
            obj.set_cookie('name', username)  # 让重定向的结果保存一个cookie
            return obj
    return render(request, 'loginPage.html')


@login_auth
def home_func(request):
    return HttpResponse('主页')


@login_auth
def home1_func(request):
    return HttpResponse('home1')


@login_auth
def home2_func(request):
    return HttpResponse('home2')

django操作session

session是保存在服务端上的数据就应该有一个表来保存。django自带了该表,只需要执行数据库迁移命令就会生成一个django_session表

def set_se_func(request):
    request.session['desc'] = '头好晕啊,啥时候能恢复身体啊'
    return HttpResponse('回家吧') 
当我们在访问这个路由时,便会往django_session表 内插入一个随机的字符串(密文)并且含有到期时间。默认14天。

        1.生成一个随机字符串
        2.对value数据做加密处理 并在django_session表中存储
            随机字符串>>>加密数据
        3.将随机字符串也发送一份给客户端保存(cookie)
            sessionid:随机字符串

# 获取sesion
	request.session.get() 
        1.自动获取随机字符串
        2.去django_session表中根据随机字符串获取加密的数据
        3.自动解密数据并处理到request.sesion.get()中

也可以设置过期时间
	request.session.set_expiry(秒)
posted @ 2022-12-24 17:44  李阿鸡  阅读(14)  评论(0编辑  收藏  举报
Title