Django—cookie与session
Cookie
什么是Cookie
就是曲奇。(雾)
HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息(key-value格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。
简单来说:cookie就是保存在客户端浏览器上的键值对
Django操作cookie
设置cookie
obj1 = HttpResponse()
#obj1也可以是render或者redirect实例化出的对象,只要是HttpResponse对象即可
obj1.set_cookie()
获取
request.COOKIES.get()
删除
obj1.delete_cookie()
三个页面,biskit,home,login
login页面只有在登陆成功后在cookie中设置user键值对
biskit页面进入时校验cookie中有无user键,如没有,则重定向到login页面并且在url中设置保存用户访问状态的键值对。如有user键则校验成功,显示信息
def biskit(request):
print(request.COOKIES)
if request.COOKIES.get('user'): #COOKIE中有user表示用户状态为登陆成功
return render(request,'biskit.html')
else: #如没有,重定向到login页面并且在url中设置保存 next=用户访问状态的键值对
path=request.path_info
return redirect(f'/app01/login/?next={path}')
def login(request):
print(request.COOKIES)
if request.POST.get('username')=='jojo' and request.POST.get('password')=='123':
#判断url中有无next键值对
next_path=request.GET.get('next')
if next_path: #如有,在登陆成功后跳转回去
obj=redirect(next_path)
else:#如没有 则跳转到home页面
obj=redirect('/app01/home/')
obj.set_cookie('user','jojo') # 登陆成功后在cookie中设置user键值对
return obj #返回Httpresponse对象
return render(request,'login.html') #如是正常先访问的登陆页面,那就正常显示登陆页面
def home(request):
return HttpResponse(b'home')
#######注意#######
在测试中发现,只要执行到obj=redirect... 就会清空掉目前obj这个HttpResponse对象中的所有cookie,所以set_cookie放在return之前设置最最保险
Session
什么是Session
session和cookie的作用有点类似,都是为了存储用户相关的信息。不同的是,cookie是存储在本地浏览器,而session存储在服务器。存储在服务器的数据会更加的安全,不容易被窃取。但存储在服务器也有一定的弊端,就是会占用服务器的资源,但现在服务器已经发展至今,一些的session信息还是绰绰有余的。
简单来说:session就是保存在服务器上的键值对
Django操作session
Django的session会保存在数据库种的django_session表中。
def set_session(request):
if request.COOKIES.get('user'):
request.session['username']=request.COOKIES.get('user')
return HttpResponse(b'session seted')
else:
path=request.path_info
return redirect(f'/app01/login/?next={path}')
def get_session(request):
print(request.session.get('username'))
return HttpResponse(request.session.get('username'))