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>
相关推荐
2601_962097365 分钟前
GraphQL,Grafana和Dash
python·grafana·数据可视化·graphql·dash
mldong5 小时前
C# 开发者也有自己的轻量工作流引擎了:NuGet 装包,5 分钟跑通一条审批流
后端·c#·.net
爱学堂IT分享8 小时前
鹤翔老师pmp项目管理培训认证考试课 (直播录播题库送学时证明)【共58课时】-51CTO学堂
后端
benchmark_cc8 小时前
REST API 和 Python SDK 应该怎么选?量化交易数据接口选型实战
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
王的宝库8 小时前
Go 项目结构:从单文件到标准工程布局
开发语言·后端·golang
码事漫谈9 小时前
类型即世界:一个 C++ 程序员的本体论入门
后端
2601_962382439 小时前
python快乐编程网络爬虫课后答案
python·网络爬虫·学习工具·课后答案·刷题app
Rain的Java大神之路9 小时前
JavaWeb开发如何解决跨域问题
java·前端·后端·nginx·web安全·面试·运维开发
鹏哥带你干乡墅9 小时前
优选乡墅赋能培训平台如何帮助提升乡村建设?
大数据·人工智能·python
veminhe10 小时前
python调用接口获取网络信息
python