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.什么是自定义分页器 当我们需要在前端页面展示的数据太多的时候,我们总不能将数据展示在一页上面吧!这时,我们就需要自定义一个分页器,将数据分成特定的页数进行展示,每一页展示固定条数的数据! 2.为什么要用自定义分页器 如上所说:为了将数据分成多页进行展示,分别阅读,方便查询! 3.如何使用自定义分页器 3.1 自定义分页器推导过程 虽然!我们有一个封装好的…

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

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

    Python开发 2023年4月2日
    00
  • 修改密码弹出框搭建

    前端代码搭建 主要利用的是bootstrap3中js插件里的模态框版块 <li><a href=”” data-toggle=”modal” data-target=”.bs-example-modal-lg”>修改密码</a></li> <div class=”modal fade bs-example…

    Python开发 2023年4月2日
    00
  • 计算机介绍和五大组成

    1. 什么是计算机 计算机俗称‘电脑’,通电的人脑。其实,计算机所有的组成部分,都是模仿人的某一个功能或者器官。 2. 为什么要有计算机 为了执行人类通过编程语言编写的文件程序,从而把人类解放出来。 3.计算机的组成部分 计算机有五大组成部分:控制器、运算器、存储器、输入设备、输出设备。 3.1 控制器 它是计算机的指挥系统,负责控制计算机其他的组件如何进行…

    2023年4月2日
    00
  • xadmin的使用

    安装 在项目的虚拟环境下执行 pip install https://codeload.github.com/sshwsfc/xadmin/zip/django2 注意:xadmin对于不同django版本有不同的版本,一定要使用相对应的版本 在app中注册 INSTALLED_APPS = [ # … # xadmin主体模块 ‘xadmin’, # …

    Python开发 2023年4月2日
    00
  • django中的auth模块与admin后台管理

    1. auth模块 在创建完django项目之后,执行数据库迁移之后,数据库里会增加很多新表,其中有一张名为auth_user的表,当访问django自带的路由admin的时候,需要输入用户名和密码,其参照的就是auth_user表 使用python3 manage.py crataesupperuser 可以创建超级管理员用户,同时在auth_user表里…

    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
  • 实时展示用户上传的头像

    实时展示用户上传的头像 总体思路 “”” 1.首先需要给对应的上传头像input框绑定一个文本域变化事件 (当检测到用户对该文件框上传了头像就会触发一系列操作) 2.再生成一个文件阅读器对象 3.再获取用户上传的文件头像 4.把用户上传的文件头像交给文件阅读器对象FileReader读取 5.利用文件阅读器把读取的文件头像结果展示到前端页面 (修改img的s…

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