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>
相关推荐
hi星尘10 分钟前
深度解析:基于Python的微信小程序自动化操作实现
python·微信小程序·自动化
Doker 多克39 分钟前
Django 缓存框架
python·缓存·django
raoxiaoya1 小时前
同时安装多个版本的golang
开发语言·后端·golang
miracletiger3 小时前
uv 新的包管理工具总结
linux·人工智能·python
我不会编程5553 小时前
Python Cookbook-6.10 保留对被绑定方法的引用且支持垃圾回收
开发语言·python
ʚɞ 短腿欧尼3 小时前
关系数据的可视化
python·pycharm·可视化·数据可视化·图表
考虑考虑3 小时前
go使用gorilla/websocket实现websocket
后端·程序员·go
李少兄3 小时前
解决Spring Boot多模块自动配置失效问题
java·spring boot·后端
noravinsc4 小时前
django admin 中更新表数据 之后再将数据返回管理界面
数据库·django·sqlite
Piper蛋窝4 小时前
Go 1.19 相比 Go 1.18 有哪些值得注意的改动?
后端