cookie & session
cookie & session
cookie
-
cookie 即具体指的是一段小信息,它是服务器发送出来存储在浏览器上的一组组键值对,下次访问服务器时浏览器会自动携带这些键值对,以便服务器提取有用信息
cookie 的原理
-
由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
Django中操作cookie
-
获取cookie
def get_cookie(request): print (request.COOKIES) # 字典的取值 name = request.COOKIES.get( 'name' ) # 推荐使用 # name = request.COOKIES['name'] print (name) # 拿到jack return HttpResponse( 'ok' ) |
- 加盐的cookie
def salt_cookie(request): obj = HttpResponse( 'ok' ) # 加盐 set_signed_cookie 后面参数 salt 必须要传 obj.set_signed_cookie( 'name' , 'jack' ,salt = 'asd' ,max_age = None ) return obj # 加盐后的结果 # name=jack:1gPnyX:2f-3j3xnk_iJLidz2MlVFUa99JE ''' 参数: default: 默认值 salt: 加盐 max_age: 后台控制超时时间 ''' |
-
设置cookie
- 在Httpresponse这个对象上写
def test_cookie(request): obj = HttpResponse( 'hh' ) obj.set_cookie( 'name' , 'jack' ) return obj |
- 删除cookie
def logout(request): obj = redirect( "/login/" ) obj.delete_cookie( "name" ) # 删除用户浏览器上之前设置的cookie值 return obj |
- 用cookie实现登录后查看订单的校验
from django.shortcuts import render, HttpResponse, redirect def login(request): if request.method = = 'GET' : return render(request, 'login.html' ) if request.method = = "POST" : name = request.POST.get( 'name' ) pwd = request.POST.get( 'pwd' ) if name = = 'jack' and pwd = = '123' : obj = HttpResponse( 'login successful' ) # 设置cookie obj.set_cookie( 'is_login' , True ) return obj else : return HttpResponse( 'fail' ) def order(request): # 从发送过来的请求中拿到cookie is_login = request.COOKIES.get( 'is_login' ) if is_login: return HttpResponse( 'this is order html' ) else : return redirect( '/login/' ) |
对上述代码的简单优化,做成认证装饰器,并且登录后直接跳转到访问页面
from django.shortcuts import render, HttpResponse, redirect def login_auth(func): def inner(request, * args, * * kwargs): url = request.get_full_path() is_login = request.COOKIES.get( 'is_login' ) if is_login: return func(request, * args, * * kwargs) else : return redirect( '/login/?next={}' . format (url)) return inner def login(request): if request.method = = 'GET' : return render(request, 'login.html' ) if request.method = = "POST" : name = request.POST.get( 'name' ) pwd = request.POST.get( 'pwd' ) if name = = 'jack' and pwd = = '123' : # 从GET中拿到提交过来的next路径 next = request.GET.get( 'next' ) if next : obj = redirect( next ) else : obj = redirect( '/index/' ) # 设置cookie obj.set_cookie( 'is_login' , True ) return obj else : return HttpResponse( 'fail' ) @login_auth def order(request): return HttpResponse( 'this is order html' ) |
- cookie的其他属性
max_age 超时时间,传一个秒的时间 expires 超时时间,传一个datatime对象 path = '/' 可以设置路径,设置路径之后,path = '/index/' ,只有访问index的时候,才会携带cookie过来 domain 设置域名下有效domain = 'map.baidu.com' secure = False (默认是false,设置成 True 浏览器将通过HTTPS来回传cookie) httponly = True 只能https协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖) |
def set_session(request): # 写session,干了以下三件事(每个浏览器会生成一个随机字符串) # 随机字符串是跟浏览器相关的,数据是跟账号相关的 ''' 1 生成随机字符串:dfasfasdfa 2 取数据库存储 3 写入cookie(set_cookie('sessionid','dfasfasdfa')) ''' # 设置值 request.session[ 'name' ] = 'lqz' return HttpResponse( 'ok' ) |
注意:在执行session之前要先进行数据库的迁移操作,即python manage.py makemigrations & python manage.py migrate
在执行完上面的代码之后再django_session表中会多出一行被加密过的数据
- 取 session
正常流程,去cookie中取出随机字符串,然后到session的django_session表去查询,取出session_data的数据,解密成字典,然后取对应的值,如name
def get_session(request): name = request.session[ 'name' ] print (name) # 拿到jack return HttpResponse( 'ok' ) |
- session的一些属性

# 获取、设置、删除Session中数据 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.session.setdefault('k1',123) # 存在则不设置 del request.session['k1'] # 所有 键、值、键值对 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 会话session的key request.session.session_key # 取到随机字符串,浏览器带过来的cookie的值 # 将所有Session失效日期小于当前日期的数据删除 request.session.clear_expired() # 检查会话session的key在数据库中是否存在 request.session.exists("session_key") # 删除当前会话的所有Session数据 request.session.delete() # 删除当前的会话数据并删除会话的Cookie。 request.session.flush() # 这用于确保前面的会话数据不可以再次被用户的浏览器访问,即删数据库,又删浏览器的cookie # 例如,django.contrib.auth.logout() 函数中就会调用它。 # 设置会话Session和Cookie的超时时间 request.session.set_expiry(value) * 如果value是个整数,session会在些秒数后失效 * 如果value是个datatime或timedelta,session就会在这个时间后失效 * 如果value是0,用户关闭浏览器session就会失效 * 如果value是None,session会依赖全局session失效策略
本文来自博客园,仅供参考学习,如有不当之处还望不吝赐教,不胜感激!转载请注明原文链接:https://www.cnblogs.com/rong-z/p/10022983.html
作者:cnblogs用户
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人