Django——会话.Cookie&Session

#前言:

该博客主要讲解了在Django中关于会话的一些知识以及操作,以及关于跨站点防御的内容,小编会继续尽力更新一些优质文章,欢迎大家点赞和收藏,也欢迎大家关注等待后续文章。

一、简介:

会话指的是浏览器和web服务器之间的通信。

HTTP 协议是无状态协议。web 服务器无法知道用户上一次会话的数据,用来维护用户在访问网站过程中的状态,会话控制是使用 Cookie 和 session 一起实现。

简单总结一下,会话说到底就是用于在客户端和服务器之间跟踪用户的状态。它允许您在用户访问您的网站时存储和检索数据,以便在用户的不同请求之间保持持久性。

而Cookie,它是面向浏览器的,也就是说当我们访问一个网站的时候,浏览器会记住我们的信息,以便下次验证。

Session,它是面向服务器的,Session会话客户端是查看不了的,只有服务端才可以进行查看。

二、Cookie会话:

在Cookie会话中,关于验证登录状态是其最为重要的一个点。

1、设置Cookie会话:

在视图文件中(views.py):

设置Cookie数据包括key,value,以及能在浏览器中保存的时间。(具体细节在代码注释中都有提及)。

python 复制代码
def cookie_set(request):
    # 设置 Cookie 数据,要响应到浏览器中
    # 设置 Cookie 数据要使用 HttpResponse 对象或者其子类对象
    response = HttpResponse("设置 Cookie 数据")
    # set_cookie(key , value) , 设置 Cookie 数据不能是中文
    # Cookie 数据在浏览器中保存的时间默认为 2 周
    # max_age 设置过期时间,单位:秒
    response.set_cookie('name', 'ac' , max_age=30)
    response.set_cookie('age' , '28' , expires=datetime.datetime.now()+datetime.timedelta(days=3))
##获取当前时间并且加多少天
    return response

2、获取Cookie值:

python 复制代码
def cookie_get(request):
    print(request.COOKIES)
    data = request.COOKIES.get('name')
    return HttpResponse(f'获取 Cookie 数据{data}')

3、删除Cookie值:

python 复制代码
def cookie_del(request):
    # 删除 Cookie 数据要使用 HttpResponse 对象或者其子类对象
    response = HttpResponse('删除 Cookie 数据')
    response.delete_cookie('age')
    return response

4、用Cookie值验证登录:

下述代码包括这么几个操作:

首先我们创建了一个index.html的简单登陆页面

其次当我们响应登陆时若我们的信息在浏览器中可以正常访问,如若不在就返回登录状态。

当我们要响应一个页面,而浏览器没有我们的Cookie信息时,我们登录成功后依旧直接重定向到我们刚刚要访问的页面。

python 复制代码
def index(request):
    return render(request , 'index.html')

def login(request):
    if request.method == 'GET':
        return render(request , 'login.html')

    name = request.POST.get('username')
    password = request.POST.get('password')

    if not all([name , password]):
        return render(request , 'login.html' , {'error':'用户名或者密码错误'})
    # 获取请求中的重定向的 url 的参数
    url = request.GET.get("redirect_url")
    # 判断是否有携带这个重定向的 url 参数
    # 有,登录成功之后重定向到指定的 url 中
    # 没有,默认重定向到首页
    if url:
        response = redirect(url)
    else:
        response = redirect('/index/')

    response.set_cookie('data' , name)

    return response

def cart(request):
    # 获取浏览器请求中的 Cookie 数据
    res = request.COOKIES.get('data')
    # 判断是否有携带制定的键值对数据
    if res:
        return HttpResponse('购物车页面')
    else:
        # 浏览器中没有这份数据,需要进行登录
        url = request.path
        return redirect(f'/login/?redirect_url={url}')

def info(request):
    # 获取浏览器请求中的 Cookie 数据
    res = request.COOKIES.get('data')
    # 判断是否有携带制定的键值对数据
    if res:
        return HttpResponse('个人信息页面')
    else:
        # 浏览器中没有这份数据,需要进行登录
        url = request.path
        return redirect(f'/login/?redirect_url={url}')

若是我们面对繁琐很多页面时候,还要进行上述操作就可以用解释器来将它重定向了:

python 复制代码
def wap(func):
    def inner(request , *args , **kwargs):
        # 获取浏览器请求中的 Cookie 数据
        res = request.COOKIES.get('data')
        # 判断是否有携带制定的键值对数据
        if res:
            # 返回对应试图函数
            return func(request)
        else:
            # 浏览器中没有这份数据,需要进行登录
            url = request.path
            return redirect(f'/login/?redirect_url={url}')
    return inner

@wap
def cart(request):
    return HttpResponse('购物车页面')

@wap
def info(request):
    return HttpResponse('个人信息页面')

5、Cookie会话大小范围:

Cookie 保持数据大小是有限制的,最大保存 4 KB;

一个服务器醉倒在浏览器上保存 20 个 Cookie 数据;

一个浏览器 最多保存 300 个 Cookie。

三、Session会话:

Session 跟 Cookie 不同的是 Session 数据保存在服务端中.

当浏览器第一次请求服务端的时候,服务端会生成一个 Session 的 id 编号给浏览器,是以 Cookie 形式发给浏览器,后续浏览器继续发送请求的时候,都会携带这个 id 进行访问。

Session 也是键值对的方式保存用户数据,Session 在服务端会给每一个用户创建 Session 对象,对象的 id 值是保存在数据库中。

1、设置Session会话:

在视图文件中(views.py):

python 复制代码
def session_set(request):
    # 设置 Session 数据 , 通过 request 进行设置
    # 保存 Session 数据之后 , 会自动保存到数据库:django_session 表中
    request.session['name'] = '阿宸'
    request.session['age'] = '27'
    # 设置过期时间,单位:秒
    request.session.set_expiry(60)
    return HttpResponse('设置 Session 数据')

2、获取Session值:

python 复制代码
def session_get(request):
    res = request.session.get('name')
    return HttpResponse(f'获取 Session 数据{res}')

3、删除Session值:

python 复制代码
def session_del(request):
    # 清除过期的 Session 数据
    # request.session.clear_expired()
    # 删除某一个数据
    # del request.session['name']
    # 清空所有的数据
    request.session.flush()
    return HttpResponse('ok')

4、Session会话大小范围:

Session数据的大小通常受到服务器和浏览器的限制,因此受服务器存储的可用空间限制。

四、跨站点防御:

CSRF:跨站点伪造请求

CSRF指攻击者盗用你的身份或者以你的名义发送恶意请求(盗取你的账号,购买商品,窃取你的个人信息)

防止 CSRF 的攻击, Django 在中间件中作了 CSRF 的防御机制。

浏览器第一次访问 服务端的时候 , Django 会自动随机生成 token 数据以 Cookie 形式发送给浏览器 。当浏览器发送请i去的时候会携带这份数据到服务端中。这个中间件防御只对 post 请求有效 , get 请求无效。

当浏览器发送了 post 请求的时候,服务端会自动的进行检查 token 是否和保存的一致。用这种方式避免 CSRF。

五、总结:

该篇博客主要讲解了关于Django中会话的一些操作(Cookie和Session会话),和跨站点防御的一些基本知识。小编后续还会继续更新内容,欢迎各位大佬的指导,也欢迎各位关注我坐等后续,您的支持是我变强的最大动力!!

相关推荐
_.Switch14 分钟前
Python 自动化运维持续优化与性能调优
运维·开发语言·python·缓存·自动化·运维开发
2401_8576363915 分钟前
计算机课程管理平台:Spring Boot与工程认证的结合
java·spring boot·后端
J不A秃V头A20 分钟前
Python爬虫:获取国家货币编码、货币名称
开发语言·爬虫·python
也无晴也无风雨1 小时前
深入剖析输入URL按下回车,浏览器做了什么
前端·后端·计算机网络
阿斯卡码2 小时前
jupyter添加、删除、查看内核
ide·python·jupyter
埃菲尔铁塔_CV算法4 小时前
图像算法之 OCR 识别算法:原理与应用场景
图像处理·python·计算机视觉
封步宇AIGC5 小时前
量化交易系统开发-实时行情自动化交易-3.4.2.Okex行情交易数据
人工智能·python·机器学习·数据挖掘
2401_857610035 小时前
多维视角下的知识管理:Spring Boot应用
java·spring boot·后端
封步宇AIGC5 小时前
量化交易系统开发-实时行情自动化交易-2.技术栈
人工智能·python·机器学习·数据挖掘
代码小鑫5 小时前
A027-基于Spring Boot的农事管理系统
java·开发语言·数据库·spring boot·后端·毕业设计