django之cookie与session

cookie与session简介

"""
回忆:HTTP协议四大特性
	1.基于请求响应
	2.基于TCP、IP作用于应用层之上的协议
	3.无状态
		不保存客户端的状态
	4.无连接
"""
最开始的网站都不需要用户注册 所有人来访问获取到的数据都是一样的
随着互联网的发展很多网站需要指定当前用户的状态

cookie:保存在客户端,记录用户状态相关的信息
session:保存在服务端,记录用户状态相关的信息
ps:session的工作需要依赖于cookie

补充:浏览器有资格拒绝保存服务端发送过来的cookie数据

django操作cookie

案例1 基于cookie简单版用户登录:

urls.py:
path('login/',views.login_func),
path('home/',views.home_func),
path('home1/', views.home1_func),
path('home2/', views.home2_func),

views.py:
def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            obj = redirect('/home/')
            # cookie信息
            obj.set_cookie('name',username)
            return obj
    return render(request,'loginPage.html')

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

@login_auth
def home_func(request):
    return HttpResponse('home页面 只有登录的用户才可以查看')

@login_auth
def home1_func(request):
    return HttpResponse('home1页面 只有登录的用户才可以查看')

@login_auth
def home2_func(request):
    return HttpResponse('home2页面 只有登录的用户才可以查看')


loginPage.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    <p>username:
        <input type="text" name="username">
    </p>
    <p>password:
        <input type="text" name="password">
    </p>
    <input type="submit" value="提交">
</form>
</body>
</html>

案例2:进阶操作:用户没有登录之前想访问某个网站输入用户名密码之后就应该跳回该网站

def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            target_path = request.GET.get('next')
            if target_path:
                obj = redirect(target_path)
            else:
                obj = redirect('/home/')
            # cookie信息
            obj.set_cookie('name',username)
            return obj
    return render(request,'loginPage.html')

def login_auth(func_name):
    def inner(request,*args,**kwargs):
        # print(request.path)  # 只获取用户输入的路由信息
        # print(request.path_info)  # 只获取用户输入的路由信息
        # print(request.get_full_path_info()) # 获取用户输入的路由信息+问号后面携带的数据
        target_path = request.path_info
        if request.COOKIES.get('name'):
            res = func_name(request,*args, **kwargs)
            return res
        return redirect('/login/?next=%s'%target_path)
    return inner

django操作session

由于session是保存在服务端上面的数据 就应该有个地方能够存储
我们只需要执行数据库迁移命令即可 django会自动创建很多需要的表

django默认的session失效时间是14天

设置session
	request.session['key'] = value
		1.生成一个随机字符串
		2.value数据做加密处理 并在django_session表中存储
			随机字符串>>>加密数据
		3.将随机字符串也发送一份给客户端保存(cookie)
			sessionid:随机字符串
获取session
	request.session.get('key')
		1.自动获取随机字符串
		2.去django_session表中根据随机字符串获取加密的数据
		3.自动解密数据并处理到request.session.get()中

补充说明:
1.可以设置过期时间(request.session.set_expiry(300) # 设置session过期时间,默认秒)
2.存储session数据的位置也可以修改(settings.py修改)

基于session用户登录版

urls.py:
path('login/',views.login_func),
path('home/',views.home_func),
path('home1/', views.home1_func),
path('home2/', views.home2_func),

views.py:
def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            target_path = request.GET.get('next')
            if target_path:
                obj = redirect(target_path)
            else:
                obj = redirect('/home/')
            # 设置session信息并设置60秒过期
            request.session['jason'] = '123'
            request.session.set_expiry(60)
            return obj
    return render(request,'loginPage.html')

def login_auth(func_name):
    def inner(request,*args,**kwargs):
        # print(request.path)  # 只获取用户输入的路由信息
        # print(request.path_info)  # 只获取用户输入的路由信息
        # print(request.get_full_path_info()) # 获取用户输入的路由信息+问号后面携带的数据
        target_path = request.path_info
        # 基于session验证用户是否登录
        if request.session.get('jason'):
            res = func_name(request,*args, **kwargs)
            return res
        return redirect('/login/?next=%s'%target_path)
    return inner

@login_auth
def home_func(request):
    return HttpResponse('home页面 只有登录的用户才可以查看')

@login_auth
def home1_func(request):
    return HttpResponse('home1页面 只有登录的用户才可以查看')

@login_auth
def home2_func(request):
    return HttpResponse('home2页面 只有登录的用户才可以查看')

loginPage.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    <p>username:
        <input type="text" name="username">
    </p>
    <p>password:
        <input type="text" name="password">
    </p>
    <input type="submit" value="提交">
</form>
</body>
</html>
posted @   悠悠-winter  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示