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部分
<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>
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!