文章目录
一、cookie
1.为什么需要cookie?
由于http请求是无状态的,无法记录身份,所以需要一种机制能够长期的记录身份,最早出现的就是cookie。而cookie是由服务器下发给用户的,保存在用户的浏览器上面,用于校验身份的数据。
2.cookie的工作原理
- 用户第一次请求服务器——服务器验证用户的用户名,密码,下发cookie
- 用户第二次携带cookie请求服务器——服务器根据用户携带的cookie确认用户的身份
3.cookie的特点
优点:
1.根本上解决了用户持续访问的问题
缺点:
1.由于cookie是保存在用户本地,容易被找到,所以导致一些安全问题
2.cookie可以被修改,还可以被模仿。
4.cookie的在Django中的参数
cookie,是通过response对象来操作,可以在response返回之前,通过 response.set_cookie来设置,这个方法有以下几个参数需要注意:
- key:设置的cookie的key。
- value:key对应的value。
- max_age:改cookie的过期时间,如果不设置,则浏览器关闭后就会自动过期
- expires:过期时间,应该是一个datetime类型。
- domain:该cookie在哪个域名中有效。一般设置子域名,比如cms.example.com
- path:该cookie在哪个路径下有效。
5.Django中使用cookie
from django.http import HttpResponseRedirect
response=HttpResponseRedirect('/index/')
创建cookie:
response.set_cookie('name','hello') #键名和值
获取cookie
name=request.COOKIES.get('name')
删除cookie(response不一定是前边的一个,只有调用HRR方法即可)
1.删除指定cookie
response.delete_cookie('name')
2.删除多个cookie
keys=request.COOKIIES.keys()
for i in keys:
response.delete_cookie(i)
二、session
1.了解session
- session就是为了解决cookie不安全的问题而提出的一种会话机
- session本身就是一种会话:指一次通信从开始到结束,只有在web开发当中,session才会以会话的机制出现。
- web的session是将用户的信息存在服务器上面的一种web身份校验技术。session需要结合cookie使用,需要通过cookie给用户下发一个id(session_id),然后将用户的具体的信息,保存在服务器上面,通常是在数据库当中
2.session的使用
在创建cookie的情况下
创建session
request.session['name']='name'
获取session
session_name=request.session.get('name')
删除session
del request.session["username"] ### 删除指定session,删除的是保存在服务器上面session的值
request.session.flush() ## 删除所有的session
三、session和cookie区别
- cookie 数据存放在客户的浏览器上,session 数据放在服务器上。
- cookie 不是很安全,别人可以分析存放在本地的 cookie 并进行 cookie 欺骗,考虑到安全应当使用 session。
- session 会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用 cookie。
- 单个 cookie 保存的数据不能超过 4K,很多浏览器都限制一个站点最多保存 20 个 cookie。
- 可以考虑将登陆信息等重要信息存放为 session,其他信息如果需要保留,可以放在 cookie 中。
四、cookie和session的实操
这里我们用登录举例
views.py
# ---------------------------------------登录页面
def login(request):
if request.method == 'POST':#判断前端是否使用post请求发送数据
email = request.POST.get('email')#获取前端数据
password = request.POST.get('password')
error_msg = '' # 设置一个标记信息,反馈用户输入账号密码的可能出错提示
if email: #如果用户输入了邮箱,开始判断
user = LoginUser.objects.get(email=email)#从数据库查是否有存在的游戏
if user.password == password :
# 密码成功跳转网页,并且设置cookie和session
response = HttpResponseRedirect('/index/')#cookie需要response对象
response.set_cookie('email', email)l#设置cookie
return response#返回响应
else:#如果密码错误,提示
error_msg = '密码错误!请重新输入!'
else:#没输入邮箱而点击了登录
error_msg = '请输入账户后再登录!'
return render(request, 'login.html', locals())
写一个登录装饰器
作用是来获取用户存入的cookie和session信息,以此为依据,在用户进入其他页面时候,每次使用装饰器进行判断,如果用户是登录进来的,则可以访问,如果用户是直接输入的网址进入,则会返回至登录页面
def LoginVaild(func):
#1.当我们在首页时,想要获取用户的用户名怎么获取?需要cookie,因此我们需要将用户登录的账户存入到 cookie和session中,因此上述登录的⑤为加入cookie
#2.取出cookie和session获取的用户名进行比较,成功跳转,失败则返回登录
def inner(request.*args,**kwargs):
username=request.COOKIES.get('username')
session_username=request.session.get('username')
if username and session_username and username==session_username:
return func(request,*args,**kwargs)
else:
return HttpResponseRedirect('/login/')
return inner
写一个登出页面,目的是为了删除cookie和session的存储信息,使用户退出后,不可直接进入页面
def logout(request):
# 删除cookie和session
response = HttpResponseRedirect('/login/') # 返回登录页
response.delete_cookie('email')#删除指定cookie
del request.session['email']#删除session
return response
配置路由
path('login/', login),
path('logout/', logout),