cookie和session

cookie

服务器保存在客户端浏览器上的信息都可以称为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.日期对象   到指定日期失效

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

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

清除session

        request.session.delete()

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

以一个登录功能示例

urls.py


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

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部分


username:

password:

你可能感兴趣的:(django,python,后端)