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>
相关推荐
追逐时光者13 小时前
Everything替代工具,一款基于 .NET 开源免费、高效且用户友好文件搜索工具!
后端·.net
kunge1v513 小时前
学习爬虫第三天:数据提取
前端·爬虫·python·学习
爱学习的小鱼gogo13 小时前
python 矩阵中寻找就接近的目标值 (矩阵-中等)含源码(八)
开发语言·经验分享·python·算法·职场和发展·矩阵
Hello.Reader13 小时前
Flink 状态模式演进(State Schema Evolution)从原理到落地的一站式指南
python·flink·状态模式
红纸28113 小时前
Subword算法之WordPiece、Unigram与SentencePiece
人工智能·python·深度学习·神经网络·算法·机器学习·自然语言处理
QX_hao13 小时前
【Go】--数据类型
开发语言·后端·golang
红纸28113 小时前
Subword分词方法的BPE与BBPE
人工智能·python·深度学习·神经网络·自然语言处理
桦说编程13 小时前
线程池拒绝策略避坑:谨慎使用抛弃策略,可能导致系统卡死
java·后端
zy_destiny13 小时前
【工业场景】用YOLOv8实现反光衣识别
人工智能·python·yolo·机器学习·计算机视觉
BingoGo13 小时前
PHP 15 个高效开发的小技巧
后端·php