cookie与seccion

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

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

django操作cookie

from django.shortcuts import render,HttpResponse,redirect
一般写法:
    return	render()
	return	HttpResponse()
	return	redirect()

想要操作cookie就不能直接返回HttpResponse对象,必须先用变量接收
obj1 = render()
return obj1
obj2 = HttpResponse()
return obj2
obj3 = redirect()
return obj3

django操作cookie

推导1:

登录页面:
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/')  # 登录成功重定向到home主页
            obj.set_cookie('name', 'jason')  # 给对象添加cookie键值对,键是name值是jason
            return obj		# 登录成功重定向顺便保存cookie的键值对
    return render(request, 'login.html')
主页:
def home_func(request):
    return render(request, 'home.html')

只有登录才能查看的页面:
def home1_func(request):
    if request.COOKIES.get('name'):   # 只有我们拿到cookie的值,才允许登录
        return render(request, 'home1.html')
    return redirect('/login/')  # 如果没拿到cookie的值证明没登录,直接跳转到登录页面

image

推导2:

思考;如果有多个页面都需要登录以后才能查看,那么每一个里面都写一个cookie的获取判断,会增繁琐,而且所要修改的代码也会比较多,所以我们想到了装饰器
def login_author(func):
    def inner(request, *args, **kwargs):
        if request.COOKIES.get('name'):  # 如果cookie有值
            res = func(request, *args, **kwargs)  # 再执行函数,代表登录了
            return res   # 登录了就正常执行函数
        return redirect('/login/')  # 如果没有值,那代表没登录,那么就跳转到登录页面

    return inner

@login_author   
def home1_func(request):
    return render(request, 'home1.html')   # 只有装饰器判断登录成功才会执行该函数,返回只有登录成功才能看的页面

推导3:

进阶操作:用户没有登录之前想要访问某个网页,那他在输入了账号密码之后,应该直接跳转的就是该网页,这样更合理一点
如何实现该效果:
	1.首先要获取用户没有登录之前想要访问的网页是什么
    	用到的方法:request.path	# /home1/	用户想要访问的路由
        		 request.path_info # /home1/  用户想要访问的路由
            	request.  # /home1/?xxx=yyy	也是访问的路由会携带?后面的
    2.将用户访问的路由加入到登录页面去,这样直接登录页面就可以获取到这个路由
    3.登录判断成功以后直接重定向到用户刚开始想要访问的路由
装饰器变形:
	def login_author(func):
    def inner(request, *args, **kwargs):
        # 先获取用户想访问的是哪个页面
        target_path = request.path_info
        if request.COOKIES.get('name'):  # 如果cookie有值
            res = func(request, *args, **kwargs)  # 再执行函数,代表登录了
            return res
        """下面这句话代表如果用户没登录,那么直接跳转到登录页面,但是会在网页上面携带用户初始想要访问的网页"""
        return redirect('/login/?next=%s' % target_path)

    return inner

登录视图函数变形:
	def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            # 在用户登录的时候,就要判断有没有携带初始想要访问的网页
            tar_get_path = request.GET.get('next')
            print(tar_get_path)
            if tar_get_path:  # 如果有值,那么直接重定向到用户本身想要访问的网页
                obj = redirect(tar_get_path)  # 如果有值,那么对象添加重定向到用户想要访问的页面
            else:
                obj = redirect('/home/')  # 如果没有值,那么直接对象添加重定向到主页
            obj.set_cookie('name', 'jason')  # 不管重定向到哪个位置,都要给对象添加cookie键值对,键是name值是jason
            return obj
    return render(request, 'login.html')

django操作session

由于session是永存在服务端上面的数据,所以就应该有个地方能够存储

我们只需要执行数据库迁移命令即可 django会自动创建很多需要的表

django默认的session失效时间是14

设置session

request.session['key'] = value
	这句话的过程其实是以下步骤:
        1.生成一个随机字符串
        2.对value数据多加密处理,并在django_session表中存储
        	随机字符串>>>:加密数据
        3.将随机字符串也发送给客户端保存(cookie)
        	sessionid:随机字符串
代码展示:
def login_func(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username == 'jason' and password == '123':
            # 在用户登录的时候,就要判断有没有携带初始想要访问的网页
            tar_get_path = request.GET.get('next')
            print(tar_get_path)
            if tar_get_path:  # 如果有值,那么直接重定向到用户本身想要访问的网页
                obj = redirect(tar_get_path)  # 如果有值,那么对象添加重定向到用户想要访问的页面
            else:
                obj = redirect('/home/')  # 如果没有值,那么直接对象添加重定向到主页
            request.session['name'] = username  # 表示添加了session,随之一起发送给客户端  
            return obj
    return render(request, 'login.html')

获取session

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

代码展示:
    def login_author(func):
    def inner(request, *args, **kwargs):
        # 先获取用户想访问的是哪个页面
        target_path = request.path_info
        if request.session.get('name'):  # 如果session有值
            res = func(request, *args, **kwargs)  # 再执行函数,代表登录了
            return res
        """下面这句话代表如果用户没登录,那么直接跳转到登录页面,但是会在网页上面携带用户初始想要访问的网页"""
        return redirect('/login/?next=%s' % target_path)

    return inner

image

补充说明

1可以设置过期时间
2.存储session数据的位置也可以修改
补充知识
	 # 将所有Session失效日期小于当前日期的数据删除
    request.session.clear_expired()
    # 检查会话session的key在数据库中是否存在
    request.session.exists("session_key")
    # 删除当前会话的所有Session数据
    request.session.delete()
    # 删除当前的会话数据并删除会话的Cookie。
    request.session.flush() 
    # 设置会话Session和Cookie的超时时间
    request.session.set_expiry(value)
        * 如果value是个整数,session会在些秒数后失效。
        * 如果value是个datatime或timedelta,session就会在这个时间后失效。
        * 如果value是0,用户关闭浏览器session就会失效。
        * 如果value是None,session会依赖全局session失效策略。
posted @   雪语  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示