django中cookie session token

 

 

cookie

服务端保存在客户端浏览器上的信息都可以称之为cookie
它的表现形式一般都是k:v键值对(可以有多个)

 


session

数据是保存在服务端的并且它的表现形式一般也是k:v键值对(可以有多个)

 

token

session虽然数据是保存在服务端的 但是禁不住数据量大
服务端不再保存数据
登陆成功之后 将一段用户信息进行加密处理(加密算法之后你公司开发知道)
将加密之后的结果拼接在信息后面 整体返回给浏览器保存
浏览器下次访问的时候带着该信息 服务端自动切去前面一段信息再次使用自己的加密算法
跟浏览器尾部的密文进行比对

 

 

复制代码
obj1 = HttpResponse()
# 操作cookie
return obj1

obj2 = render()
# 操作cookie
return obj2

obj3 = redirect()
# 操作cookie
return obj3
# 如果你想要操作cookie,你就不得不利用obj对象


"""
设置cookie
    obj.set_cookie(key,value)
获取cookie
    request.COOKIES.get(key)
在设置cookie的时候可以添加一个超时时间
    obj.set_cookie('username', 'jason666',max_age=3,expires=3)
    
    max_age
    expires
        两者都是设置超时时间的 并且都是以秒为单位
        需要注意的是 针对IE浏览器需要使用expires
主动删除cookie(注销功能)
复制代码

 

 

head.{name:lqz,age:18}.eseetsweasdca

base64加码:

asdfasfd.asdfasdf.asdfasdfaeraew

 

后端校验:
用这个token去查我的账户余额,向银行发请求,银行校验通过,是银行给你的,---》返回你的余额

head.{name:lqz,age:18}.eseetsweasdca

head.{name:egon,age:18}.eseetsweasdca
def cookie_test(request):
# 浏览器向我这个地址发一个请求,就在浏览器写入 name = lqz

  obj=HttpResponse('ok')
  obj.set_cookie('name','egon') # 写入到浏览器了,在http响应头里:cookie: name=lqz
  obj.set_cookie('age','19') # 写入到浏览器了,在http响应头里:cookie: name=lqz
  return obj

 

 

 

 

 

 

django中cookie的使用:

复制代码
def get_cookie(request):

print(request.COOKIES)
print(request.COOKIES.get('name'))
return HttpResponse('我拿了你传过来的cookie')


def delete_cookie(request):


obj=HttpResponse('我删掉了你 name 这个cookie ')
obj.delete_cookie('name')
return obj
复制代码

 

 

 token在settings中设置:

#token过期时间为7天:
import datetime
JWT_AUTH={
    'JWT_EXPIRATION_DELTA':datetime.timedelta(days=7),
}

 

 

 

 

# 0 会话跟踪,会话保持
# 1 cookie规范
-记住:当前网站在浏览器上cookie个数和大小有限制
-Cookie大小上限为4KB;
-一个服务器最多在客户端浏览器上保存20个Cookie;
-一个浏览器最多保存300个Cookie;
# 2 django中操作cookie
-增:obj.set_cookie('key','value')
-删: obj.delete_cookie('key') # 设置过期
-查: request.COOKIES.get('key')
-改: obj.set_cookie('key','value1')
# 3 带签名的cookie(加盐,加密)
-增:obj.set_signed_cookie('name','lqz','123')
-删: obj.delete_cookie('name') # 设置过期
-查: request.get_signed_cookie('name',salt='123')
-改: obj.set_signed_cookie('name','lqz','123')

 

 

2 cookie版登陆校验例

路由:

# cookie版登录
path('login/', views.login),
path('order/', views.order),
path('logout/', views.logout),
path('userinfo/', views.userinfo),

视图函数:

复制代码
## 登录认证装饰器

def login_auth(func):
    def inner(request, *args, **kwargs):
        # 登录校验
        name = request.COOKIES.get('name')
        if name:
            res = func(request, *args, **kwargs)
            return res
        else:
            path = request.get_full_path()
            return redirect('/login/?returnUrl=%s' % path)

    return inner


### cookie版登录
def login(request):
    if request.method == 'GET':

        return render(request, 'login.html')
    else:
        name = request.POST.get('name')
        password = request.POST.get('password')
        if name == 'lqz' and password == '123':
            # 写入cookie
            # 登录成功,重定向
            path = request.GET.get('returnUrl')
            if path:
                obj = redirect(path)
            else:
                obj = redirect('/index/')
            obj.set_cookie('name', name)
            return obj
        else:
            return HttpResponse('用户名或密码错误')


# def order(request):
#     name = request.COOKIES.get('name')
#     if name:
#         return render(request,'order.html')
#     else:
#         return redirect('/login')

## 装饰器版本(只要加了装饰器,一旦进入这个视图函数,就表明登录成了)
@login_auth
def order(request):
    return render(request, 'order.html')


@login_auth
def userinfo(request):
    return render(request, 'userinfo.html')


def logout(request):
    obj = HttpResponse('退出登录成功')
    obj.delete_cookie('name')
    return obj
复制代码

模板:login.html:

<form action="" method="post">
    <p>用户名:<input type="text" name="name"></p>
    <p>密码:<input type="password" name="password"></p>
    <p><input type="submit" value="提交"></p>
</form>

order.html:

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a href="/logout/">点我退出</a>
</body>
</html>
复制代码

userinfo.html:

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>用户信息页面</h1>
</body>
</html>
复制代码

 

 

 

案例二:

我们完成一个真正的登陆功能
校验用户是否登陆的装饰器

用户如果在没有登陆的情况下想访问一个需要登陆的页面
那么先跳转到登陆页面 当用户输入正确的用户名和密码之后
应该跳转到用户之前想要访问的页面去 而不是直接写死

 

复制代码
def login_auth(func):
    def inner(request,*args,**kwargs):
        # print(request.path_info)
        # print(request.get_full_path())  # 能够获取到用户上一次想要访问的url
        target_url = request.get_full_path()
        if request.COOKIES.get('username'):
            return func(request,*args,**kwargs)
        else:
            return redirect('/login/?next=%s'%target_url)
    return inner

def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':

            # 获取用户上一次想要访问的url
            target_url = request.GET.get('next')  # 这个结果可能是None
            if target_url:
                obj = redirect(target_url)
            else:
                # 保存用户登陆状态
                obj = redirect('/home/')
            # 让浏览器记录cookie数据
            obj.set_cookie('username', 'jason666')
            """
            浏览器不单单会帮你存
            而且后面每次访问你的时候还会带着它过来
            """
            # 跳转到一个需要用户登陆之后才能看的页面
            return obj
    return render(request,'login.html')


@login_auth
def home(request):
    # 获取cookie信息 判断你有没有
    # if request.COOKIES.get('username') == 'jason666':
    #     return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")
    # # 没有登陆应该跳转到登陆页面
    # return redirect('/login/')
    return HttpResponse("我是home页面,只有登陆的用户才能进来哟~")
复制代码

 

session

session数据是保存在服务端的,给客户端返回的是一个随机字符串
sessionid:随机字符串


session是保存在服务端的 但是session的保存位置可以有多种选择
1.MySQL
2.文件
3.redis
4.memcache
...

django_session表中的数据条数是取决于浏览器的
同一个计算机上(IP地址)同一个浏览器只会有一条数据生效
(当session过期的时候可能会出现多条数据对应一个浏览器,但是该现象不会持续很久,内部会自动识别过期的数据清除 你也可以通过代码清除)

主要是为了节省服务端数据库资源



1.在默认情况下操作session的时候需要django默认的一张django_session表
数据库迁移命令:

python manage.py makemigrations
python manage.py migrate

 


django会自己创建很多表 django_session就是其中的一张

 

 

 

django默认session的过期时间是14天
但是你也可以人为的修改它

 

 

设置session

复制代码
request.session['key'] = value

获取session
request.session.get('key')

设置过期时间
request.session.set_expiry()
    括号内可以放四种类型的参数
        1.整数                        多少秒
        2.日期对象               到指定日期就失效
        3.0                                一旦当前浏览器窗口关闭立刻失效
        4.不写                        失效时间就取决于django内部全局session默认的失效时间
复制代码

 

 

 

清除session

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

 

 

复制代码
request.session['hobby'] = 'girl'
    """
    内部发送了那些事
        1.django内部会自动帮你生成一个随机字符串
        2.django内部自动将随机字符串和对应的数据存储到django_session表中
            2.1先在内存中产生操作数据的缓存
            2.2在响应结果django中间件的时候才真正的操作数据库
        3.将产生的随机字符串返回给客户端浏览器保存
    """
request.session.get('hobby')
    """
    内部发送了那些事
        1.自动从浏览器请求中获取sessionid对应的随机字符串
        2.拿着该随机字符串去django_session表中查找对应的数据
        3.
            如果比对上了 则将对应的数据取出并以字典的形式封装到request.session中
            如果比对不上 则request.session.get()返回的是None
    """
复制代码

 

posted @   朱饱饱  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
点击右上角即可分享
微信分享提示