首页 > 其他分享 >django中的cookie与session

django中的cookie与session

时间:2022-08-19 14:34:37浏览次数:63  
标签:浏览器 登录 request django session cookie

发展史

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完成动态跳转登录

标签:浏览器,登录,request,django,session,cookie
From: https://www.cnblogs.com/suncolor/p/16587949.html

相关文章

  • 大家都能看得懂的源码 - 如何封装 cookie/localStorage/sessionStorage hook?
    本文是深入浅出ahooks源码系列文章的第九篇,该系列已整理成文档-地址。觉得还不错,给个star支持一下哈,Thanks。今天来看看ahooks是怎么封装cookie/localStorage/sess......
  • Django TextField
    如下图,官方文档中解释含义:即使设置了max_length,只会在前端表单的Textarea框中输入有限制. 并没有在模型表或数据库MySQL中被限制. ......
  • 16 Django-extra查询
    知识点补充:如何只拿出,dt字段中的年月字段?知识点补充:extra有些时候复杂的sql语句,Django无法去对应。extra(select=None,where=None,params=None,tables=None,ord......
  • 12-Cookie
    12-Cookie概述终于学到了最想了解的Cookie和Session了,其实这些概念很简单,,强烈推荐狂神说的视频把Cookie讲的十分简单Cookie,是曲奇饼思考一下,学校如何知道你是这个学......
  • django插入数据库报错 1366, "Incorrect string value: '\\xF0\\x9F\\x9A\\xA
     报错: 1366,"Incorrectstringvalue:'\\xF0\\x9F\\x9A\\xA8 是因为mysql不能识别4个字节的utf8编码的字符,抛出了异常,这应该也是问题的根源。☺、��、类似于这种4个字......
  • django-haystack使用whoosh创建索引
    快速入门环境安装首先需要清楚以下各个库的作用django是基于python开发的web框架,阅读本文需要了解相关的基础知识django-haystack为Django提供模块化搜索。它具有......
  • Js的cookie和session
    Cookie的概念:保存在客户端一个字符串属性,读取cookie的值时,得到一个字符串;cookie除了name名和value值外,还有expires过期时间、path路径、domain域、以及secure安全。JS代码......
  • Django连接MySQL与正反向迁移命令
    目录连接MySQL方法一:pymysql连接方法二:mysqlclient迁移命令连接MySQL方法一:pymysql连接第一步:修改settings.py配置文件中的DATABASES:DATABASES={'default':{......
  • 服务器部署 Vue 和 Django 项目的全记录
    本篇记录我在一个全新服务器上部署Vue和Django前后端项目的全过程,内容包括服务器初始配置、安装Django虚拟环境、pythonweb服务器uWSGI和反向代理Nginx的使用,......
  • java 携带session 前台传递cookie 跨域解决方案 vue + java
    前台axios设置withCredentials:true后台设置header("Access-Control-Allow-Origin","源地址";header("Access-Control-Allow-Credentials","true");这里源地址......