django中的cookie、session和token

发展史

1.早期的时候,网站都没有保存用户功能的需求,所有用户访问网站返回的结果都是一样的,比如新闻、文章等网站!

2.但是,随着网站的发展,出现了一些需要保存用户信息的网站,比如:淘宝、京东、个人博客等!

3.以登录功能为例,如果不保存用户登录的信息,就意味着用户每次都需要重新登录网站,为此非常的麻烦。

4.为了解决上述的麻烦,便产生了cookie和session

image

1.cookie

1.1 什么是cookie

当用户第一次登录之后,浏览器会将您登录之后的用户名和密码保存到用户浏览器,让其保存在本地,之后再次访问网站的时候,浏览器会帮您自动的将保存的用户名和密码发送到浏览器,这样就省去了登录的操作!

装逼小技巧:当你点击浏览器的设置,在里面查找cookie权限时,选择不允许站点保存cookie时,以后该浏览器上需要用到记录用户状态(登录)的功能都无法实现了!

image

1.2 为什么要用cookie

为了减少每次登录网站都要登录的麻烦,减少用户每次操作都需要登录的操作(每次添加到购物车一下就需要登录将非常的麻烦)!

1.3 cookie的危害

早期这样将用户的信息保存在浏览器是有非常大的隐患的!其他人很容易在浏览器内看到你保存的用户名和密码,这样用户的信息就不安全了!
image

1.4 如何使用cookie

存储/添加/修改:
def set_cookies(request):
    resp = HttpResponse('set cookies is ok')
    resp.set_cookie('uuname', 'zhangyang', max_age=500,expires=500)
return resp
每一个响应对象对有一个set_cookies方法里面的参数分别是:key、value、max_age保存时间单位s,expires对于ie浏览器生效的保存时间
删除:
httpresponse.delete_cookie(‘key’)--删除指定key的cookie,如果key不存在,则什么也不发生
获取cookies:
​value = request.COOKIES.get('key’,'默认值‘)
利用cookie制作动态跳转登录
from django.shortcuts import render
from django.http import HttpResponse,HttpResponseRedirect

# 装饰器 实现功能是只有登录了之后才能访问到该页面,否则跳转到登录页面
def login_out(func):
    def wrapper(request,*args,**kwargs):
        target_url = request.get_full_path()
        # print(target_url)
        if request.COOKIES.get('username'):
            res=func(request,*args,**kwargs)
            return res
        else:
            # 此处的设计是为了动态的获取用户是从那个页面进行登录的,如何执行登录之后在跳转回该页面
            return HttpResponseRedirect('/login?next=%s'%target_url)
    return wrapper

# Create your views here.
def login(request):
    if request.method == 'POST':
        username = request.POST.get('username')
        password = request.POST.get('password')
        if username=='zhang' and password=='123':
            # 获取用户是从哪个页面登录的url
            url = request.GET.get('next')
            if url:
                # 获取到了则登录成功跳转到该页面
                obj = HttpResponseRedirect(url)
            else:
                # 没有获取到则跳转到默认页面
                obj = HttpResponseRedirect('/login')
            obj.set_cookie('username','zhang')
            return obj
    return render(request,'login.html')

@login_out
def home(request):
    return HttpResponse('这是登录之后的home页面')

@login_out
def index(request):
    return HttpResponse('这是登录之后的导航页')

2. session

2.1 什么是session

为了解决cookie产生的危害,便产生了session,session是借助cookie进行工作的!当用户将登录的信息返回到服务器,服务器会将用户的信息保存在服务器内并返回一个随机的字符串给浏览器,该字符串与这个用户的信息相对应!浏览器将这个随机字符串以cookie的形式保存在浏览器本地,以后每次需要访问网站的时候,浏览器就会把这个cookie的随机字符串返回给服务器,服务器匹配与之对应的用户信息返回给前端!
image

2.2 为什么要有session

为了解决cookie所存在的安全隐患,更好的保护用户的隐私。

2.3 如何使用session

session对象是一个类似于字典的对象,可以用类似字典的方式进行操作--session能够存储字符串、整形、字典、列表等

1.保存session的值到服务器
def set_session(request):
    request.session['uname'] =  'wwc'   ---存储session的写法
"""
    内部发送了那些事
        1.django内部会自动帮你生成一个随机字符串
        2.django内部自动将随机字符串和对应的数据存储到django_session表中
            2.1先在内存中产生操作数据的缓存
            2.2在响应结果django中间件的时候才真正的操作数据库
        3.将产生的随机字符串返回给客户端浏览器保存
"""
return HttpResponse('set session is ok')
存储时会报错时,可能是因为没有执行数据库迁移命令,因为session是保存在服务端的,它需要django中有一张默认的django_session表

2.获取已经存储的session值
def get_session(request):
    value = request.session.get['uname',默认值]
"""
    内部发送了那些事
        1.自动从浏览器请求中获取sessionid对应的随机字符串
        2.拿着该随机字符串去django_session表中查找对应的数据
        3.
            如果比对上了 则将对应的数据取出并以字典的形式封装到request.session中
            如果比对不上 则request.session.get()返回的是None
"""
return HttpResponse('session value is %s' % value)

3.删除session
del request.session['key']
request.session.delete()  # 只删服务端的 客户端的不删
request.session.flush()  # 浏览器和服务端都清空(推荐使用)

4.设置session的保存时长(默认是2周)
法一:
	request.session.set_expiry()
	括号内可以放四种类型的参数
	1.整数		多少秒
	2.日期对象	指定日期就失效
	3.0		一旦当前浏览器窗口关闭立刻失效
	4.不写		失效时间就取决于django内部全局session默认的失效时间
法二:
	在setting.py中添加配置项SESSION_COOKIE_AGE=60*60*24*7*2
	或者设置SESSION_EXPIRE_AT_BROWSER_CLOSE = True---表示只要浏览器关闭时,session就失效(默认为Flase)

5.其他需要了解的知识点
session是保存在服务端的 但是session的保存位置可以有多种选择
	1.MySQL
	2.文件
	3.redis
	4.memcache
	...

django_session表中的数据条数是取决于浏览器的
	同一个计算机上(IP地址)同一个浏览器只会有一条数据生效
	(当session过期的时候可能会出现多条数据对应一个浏览器,但是该现象不会持续很久,内部会自动识别过期的数据清除 你也可以通过python3 manage.py clearsessions清除)
	主要是为了节省服务端数据库资源

小练习:如何利用session完成动态跳转登录

3.token

3.1什么是token

当我们使用session在服务端存储用户的信息,如果用户过多,存储信息量大,则很耗费服务端资源!因此,产生了token来解决这一问题。

token就是一串加密的字符串,该字符串即保存着用户信息又安全,在发送给服务端时,我们可以对该字符串用我们的算法进行比对,如果正确则用户信息正确,不一致则被篡改了!
image

小作业:通过django中间件实现token功能!

思路图:
image

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:django中的cookie、session和token - Python技术站

(0)
上一篇 2023年4月2日
下一篇 2023年4月2日

相关文章

  • django自带的序列化组件

    1.什么是序列化组件 在django中,自带一个序列化组件,它是用来将数据进行整理、转化成特定的为一个特定的格式(比如json数据格式),然后传输给前端,以便前端对数据进行处理操作。 2.为什么要用序列化组件 当我们从数据库取出一些数据时,我们需要将数据转成特定的格式,比如列表套字典的形式,然后将这些数据序列化成json的格式传输给前端,这就需要我们在后端把…

    Python开发 2023年4月2日
    00
  • 登录注册接口搭建

    登录接口分析 登录分为多方式登录和验证码登录方式 多方式登录 1)前台提供账号密码,账号可能是 用户名、手机号、邮箱等 接口: 后台只需要提供一个多方式登录接口即可 – 多方式登录接口 多方式登录接口 前端输入完账号和密码,点击登录,向后端发送请求进行校验用户登录数据 urls.py from django.urls import path,re_path,…

    Python开发 2023年4月2日
    00
  • rest_framework中的分页功能

    为什么要使用分页 我们数据表中可能会有成千上万条数据,当我们访问某张表的所有数据时,我们不太可能需要一次把所有的数据都展示出来,因为数据量很大,对服务端的内存压力比较大还有就是网络传输过程中耗时也会比较大。 通常我们会希望一部分一部分去请求数据,也就是我们常说的一页一页获取数据并展示出来。 分页的三种方式 方式一:基本的分页,就是正常的查第几页每页显示多少条…

    2023年4月2日
    00
  • django中的request对象方法

    1.什么是request对象 在django中,当一个页面被请求时,Django就会创建一个包含本次请求原信息的HttpRequest对象;Django会将这个对象自动传递给响应的视图函数,一般视图函数约定俗成地使用 request 参数承接这个对象。 2.request对象的作用 request对象里面封装了请求时拿到的数据,我们可以通过request.的…

    Python开发 2023年4月2日
    00
  • 多道技术、同步异步和阻塞非阻塞

    前期需要储备的知识点 并发 看起来同时运行的就可以称之为并发,其实内部是做了0.1秒A,做了0.1秒B,交替进行运作,看起来像是一起运作的。 并行 真正意义上的同时执行 补充 1.并行肯定算是并发2.单核的计算机肯定不能实现并行,但是可以实现并发!!3.我们这里的单核是假设就是一个核,干活的就一个人,不考虑cpu里面的内核 1. 多道技术 1.1 什么是多道…

    2023年4月2日
    00
  • bbs项目前期准备和表设计

    一、前期准备 1.新建一个django项目 2.连接mysql数据库(注意需要在init文件里面书写import pymysql),告诉django使用pymysql连接数据库 3.静态文件路径在settings里配置一下,并且在项目文件夹下新建一个静态文件夹 4.将需要用到bootstrap的css和js文件添加到static文件夹内 二、bbs项目表设计…

    Python开发 2023年4月2日
    00
  • 如何制作验证码

    推导步骤1:在img标签的src属性里放上验证码的请求路径 补充1.img的src属性: 1.图片路径 2.url 3.图片的二进制数据 补充2:字体样式 我们计算机上之所以可以输出各种各样的字体样式,其内部其实对应的是一个个以.ttf结尾的文件 由于img的src属性里可以放图片的二进制数据,因此我们可以在src里放上图片的请求路径,返回的是一个图片的二进…

    Python开发 2023年4月2日
    00
  • python中的内置函数

    内置函数 # 1.abs函数 print(abs(-1)) # 绝对值方法 # 2.all函数 print(all([1,’aaa’,”])) # false print(all([])) # true #all方法里面是一个可迭代对象,all会自动将这个对象for循环一下,如果所有的值为true,则返回true;如果可迭代对象为空,则返回true # 3…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部