当前位置:   article > 正文

Django(5)|Django中的cookie和session_django cookie

django cookie

一、cookie

1.为什么需要cookie?

由于http请求是无状态的,无法记录身份,所以需要一种机制能够长期的记录身份,最早出现的就是cookie。而cookie是由服务器下发给用户的,保存在用户的浏览器上面,用于校验身份的数据。

2.cookie的工作原理

  1. 用户第一次请求服务器——服务器验证用户的用户名,密码,下发cookie
  2. 用户第二次携带cookie请求服务器——服务器根据用户携带的cookie确认用户的身份

3.cookie的特点

优点:
	1.根本上解决了用户持续访问的问题

缺点:
	1.由于cookie是保存在用户本地,容易被找到,所以导致一些安全问题
	2.cookie可以被修改,还可以被模仿。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

二、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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

三、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())

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

写一个登录装饰器

作用是来获取用户存入的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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

写一个登出页面,目的是为了删除cookie和session的存储信息,使用户退出后,不可直接进入页面

def logout(request):
    # 删除cookie和session
    response = HttpResponseRedirect('/login/')  # 返回登录页
    response.delete_cookie('email')#删除指定cookie
    del request.session['email']#删除session
    return response
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

配置路由

path('login/', login),
path('logout/', logout),
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/559534
推荐阅读
相关标签
  

闽ICP备14008679号