cookie和session

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

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的超时时间

max_age

expires (针对IE浏览器)

两个都是以秒为单位

主动删除cookie

delete_cookie

session

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

给客户端返回的是一个随机字符串

在默认情况下操作session的时候需要Django默认的一张django_session表

数据库迁移命令Django会自己创建很多表,django_session表就是其中一张

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

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

设置session

request.session['key'] = value

获取

request.session.get('key')

设置过期时间

request.session.set_expiry()

括号内可以放四种类型的参数

1.整数 秒

2.日期对象 到指定日期失效

  1. 0 一旦当前浏览器窗口关闭立刻失效

4.不写 失效时间取决于Django内部全局session默认的失效时间

清除session

request.session.delete()

request.session.flush() 服务端和浏览器都清空

以一个登录功能示例

urls.py

python 复制代码
from django.contrib import admin
from django.urls import path
from app01 import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('login/', views.login),
    path('home/', views.home),
    path('index/', views.index),
    path('logout/', views.logout),
    path('set_session/', views.set_session),
    path('get_session/', views.get_session),
]

views.py

python 复制代码
from django.shortcuts import render,redirect,HttpResponse

#校验用户是否登录的装饰器
def login_auth(func):

    def inner(request,*args,**kwargs):
        target_url = request.get_raw_uri()
        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=='kk' and password=='123':

            #获取用户上一次要访问的url
            target_url=request.GET.get('next')
            if target_url:
                obj = redirect(target_url)
            else:
                obj = redirect('/home/')
            #让浏览器记录cookie数据
            obj.set_cookie('username','kk111',max_age=5)
            #超时时间5秒
            return obj
    return render(request,'login.html')
@login_auth
def home(request):
    if request.COOKIES.get('username')=='kk111':
        return HttpResponse('ok')
    return redirect('/login/')

@login_auth
def index(request):
    return HttpResponse('index')

@login_auth
def logout(request):
    obj = redirect('/login/')
    obj.delete_cookie('username')
    return obj

def set_session(request):
    request.session['hobby']='play'
    '''
    1.Django内部自动帮你生成一个随机字符串
    2.Django内部自动将随机字符串和对应的数据存储都Django_session表中(这一步不是直接操作的)
        先在内存中产生操作数据的缓存
        在响应经过Django中间件的时候才真正操作数据库
    3.将产生的随机字符串返回给客户端浏览器保存
    '''
    request.session.set_expiry(3)
    return HttpResponse('ok')

def get_session(request):
    print(request.session.get('hobby'))
    '''
    内部发生的事
    1.自动从浏览器请求中获取sessionid对应的字符串
    2.拿着该随机字符串去Django_session表中查找对应的数据
    3.如果对比上了,则将对应的数据取出并以字典的形式封装到request.session中
        如果对比不上,request.session.get()则返回的是None 
    '''
    if request.session.get('hobby'):
        return HttpResponse('good')
    return HttpResponse('no')

html部分

html 复制代码
<body>
<form action="" method="post">
    <p>username:<input type="text" name="username"></p>
    <p>password:<input type="text" name="password"></p>
    <input type="submit">
</form>
相关推荐
DanCheng-studio13 分钟前
毕设 大数据抖音短视频数据分析与可视化(源码)
python·毕业设计·毕设
努力的布布21 分钟前
SpringMVC源码-AbstractHandlerMethodMapping处理器映射器将@Controller修饰类方法存储到处理器映射器
java·后端·spring
PacosonSWJTU25 分钟前
spring揭秘25-springmvc03-其他组件(文件上传+拦截器+处理器适配器+异常统一处理)
java·后端·springmvc
记得开心一点嘛34 分钟前
在Java项目中如何使用Scala实现尾递归优化来解决爆栈问题
开发语言·后端·scala
黄俊懿1 小时前
【深入理解SpringCloud微服务】手写实现各种限流算法——固定时间窗、滑动时间窗、令牌桶算法、漏桶算法
java·后端·算法·spring cloud·微服务·架构
易辰君1 小时前
python爬虫 - 深入requests模块
开发语言·爬虫·python
人工智障调包侠1 小时前
基于深度学习多层感知机进行手机价格预测
人工智能·python·深度学习·机器学习·数据分析
2401_857439692 小时前
“衣依”服装销售平台:Spring Boot技术应用与优化
spring boot·后端·mfc
计算机编程-吉哥2 小时前
计算机毕业设计 基于Python的智能文献管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
python·django·毕业设计·计算机毕业论文·计算机毕业设计选题·软件工程毕业设计论文·文献管理系统
Jerry.ZZZ2 小时前
系统设计,如何设计一个秒杀功能
后端