Django 状态保持搭配与存储的实现

目录
  • 引子
  • 为什么需要状态保持
    • 如何实现状态保持
  • Cookie
    • Cookie的工作原理
    • Cookie的特点
    • Cookie与django服务器执行流程
    • 配置Cookie
    • 读取Cookie
  • Session
    • Session的特点:
    • Session与django服务器执行流程
    • 启用Session
    • 存储数据库
    • 本地缓存
    • 混合存储
    • session使用
    • Session操作

引子

之前在学习Django时,对状态保持这个概念很模糊,不知道怎么去保持,通过什么去实现保持都不太清楚;稍微花了一点时间,把状态保持的基本概念,使用cookie与session进行存储以及基本操作搭配图文给理清了;阅读本文大约需要 15min

为什么需要状态保持

因为通常浏览器请求服务器是 无状态 的,一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。

无状态原因:浏览器与服务器是使用Socket套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的Socket连接,而且服务器也会在处理页面完毕之后销毁页面对象。

因此可以使用状态保持来实现保持用户浏览的状态,比如用户是否登录过,浏览过哪些商品等

如何实现状态保持

实现状态保持主要有两种方式:

  • 在客户端存储信息使用Cookie
  • 在服务器端存储信息使用Session

Cookie

Cookie的工作原理

由于HTTP是一种无状态的协议,服务器单从网络连接上无从知道客户身份。怎么办呢?

就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。

Cookie的特点

  • Cookie是由服务器生成,存储在浏览器端的一小段文本信息,以键值对方式进行存储。
  • 通过浏览器访问一个网站时,会将本地存储的跟网站相关的所有cookie信息发送给该网站的服务器。
  • Cookie是基于域名安全的。
  • Cookie是有过期时间的,如果不指定,默认关闭浏览器之后cookie就会过期。

Cookie与django服务器执行流程

配置Cookie

通过 HttpResponse 对象中的 set_cookie 方法来设置cookie。

HttpResponsse.set_cookit(sookie名, value=cookie值, max_age=cookie有效期)

写法: 设置存储的键值,设置存储事件

def cookie(request):
    response = HttpResponse('ok')
    response.set_cookie('make', 'Golang')  # 临时cookie
    response.set_cookie('luxor', 'PHP', max_age=3600)  # 有效期一小时
    # max_age 单位为秒, 默认为None. 如果是临时cookie, 可将max_age设置为None.

读取Cookie

可以通过 HttpResponse 对象的 COOKIES 属性来读取本次请求携带的cookie值。request.COOKIES为字典类型

def cookie(request):
    cookie1 = request.COOKIES.get('make')
    print(cookie1)
    return HttpResponse('OK')

Session

Django完全支持也匿名会话,简单说就是使用跨网页之间可以进行通讯,比如显示用户名,用户是否已经发表评论。session框架让你 存储和获取访问者的数据信息 ,这些信息保存在服务器上(默认是数据库中),以 cookies 的方式发送和获取一个包含 session ID的值,并不是用cookies传递数据本身。

Session的特点:

  • 在服务器端进行状态保持的方案就是Session。
  • session是以键值对进行存储的。
  • session依赖于cookie。
  • session也是有过期时间,如果不指定,默认两周就会过期。

Session与django服务器执行流程

启用Session

编辑 settings.py 中的一些配置

MIDDLEWARE_CLASSES 确保其中包含以下内容

'django.contrib.sessions.middleware.SessionMiddleware',

存储数据库

存储在数据库中,如下设置可以写,也可以不写,这是默认存储方式

SESSION_ENGINE='django.contrib.sessions.backends.db'

如果存储在数据库中,需要在项 INSTALLED_APPS 中安装Session应用。

'django.contrib.sessions',

这些是默认启用的。如果你不用的话,也可以关掉这个以节省一点服务器的开销。

数据库中的表如图所示

由表结构可知,操作Session包括三个数据:键,值,过期时间。

本地缓存

存储在本机内存中,如果丢失则不能找回,比数据库的方式读写更快。

SESSION_ENGINE='django.contrib.sessions.backends.cache'

混合存储

优先从本机内存中存取,如果没有则从数据库中存取。

SESSION_ENGINE='django.contrib.sessions.backends.cached_db'

session使用

  • 创建模拟登录视图

    def testsession(request):
        # 更新数据库的session数据
        request.session['name'] = 'Shrimps'
        request.session['age'] = 22
        request.session['userid'] = 1024
    
        return HttpResponse('Good')
  • 创建模拟主页视图
    from django.http import HttpResponse
    
    def testIndex(request):
    # 查询主页的数据
        userid = request.session.get('userid')
        name = request.session.get('name')
    
        if userid:
            print('登陆过')
            return HttpResponse(f'Hello - {name} ')
        else:
            print('未登录')
            return HttpResponse('未登录')
  • 登录后访问主页

在这里我是定义时间事件 所以才会显示晚上好

# 代码如下 - (在 return HttpResponse('Good') 之前执行)

# 判断当前时间
    now_time = datetime.datetime.now().strftime('%H')
    now_time = int(now_time)
    if now_time > 12 and now_time < 18:
        now_time = '下午好'
    elif now_time < 12:
        now_time = '早上好'
    else:
        now_time = '晚上好'

Session操作

通过HttpRequest对象的session属性进行会话的读写操作。

1) 以键值对的格式写session。

request.session['键']=值

2)根据键读取值。

request.session.get('键',默认值)

3)清除所有session,在存储中删除值部分。

request.session.clear()

4)清除session数据,在存储中删除session的整条数据。

request.session.flush()

5)删除session中的指定键及值,在存储中只删除某个键及对应的值。

del request.session['键']

6)设置session的有效期

request.session.set_expiry(value)

value规则:

  • 如果value是一个整数,session将在value秒没有活动后过期。
  • 如果value为0,那么用户 session的Cookie将在用户的浏览器关闭时过期。
  • 如果value为None,那么session有效期将采用系统默认值, 默认为两周,可以通过在 settings.py 中设置SESSION_COOKIE_AGE来设置全局默认值。

到此这篇关于Django 状态保持搭配与存储的实现的文章就介绍到这了,更多相关Django 状态保持搭配与存储内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • django之状态保持-使用redis存储session的例子

    关于redis安装,pip install django-redis-sessions,按照提示进行安装相关的服务端 和客户端. django版本1.8.2, Python版本2.7.12 1 进入虚拟环境h1 workon h1 2 创建一个项目test应用booktest django-admin startproject test 3 创建应用booktest 进入项目test目录,创建应用booktest,这个booktest应用目录和manage.py在 同级目录下 python ma

  • django session完成状态保持的方法

    本例使用登录页面演示,session的状态保持功能. 说明:因为http是无状态的,客户端请求一次页面后,就结束了,当再次访问时,服务器端并不知道浏览器此访问过什么.所以这样就需要状态保持功能,状态保存有两种方式:session和cookie都能实现状态保持. 状态保持 http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态 客户端与服务器端的一次通信,就是一次会话 实现状态保持的方式:在客户端或服务器端存储与会话有关的数据 存储方式包括cookie.session,会话一般指

  • Django 状态保持搭配与存储的实现

    目录 引子 为什么需要状态保持 如何实现状态保持 Cookie Cookie的工作原理 Cookie的特点 Cookie与django服务器执行流程 配置Cookie 读取Cookie Session Session的特点: Session与django服务器执行流程 启用Session 存储数据库 本地缓存 混合存储 session使用 Session操作 引子 之前在学习Django时,对状态保持这个概念很模糊,不知道怎么去保持,通过什么去实现保持都不太清楚:稍微花了一点时间,把状态保持的基

  • Django中Cookie搭配Session使用实践

    目录 Cookie的作用 Cookie登录的实现过程 Cookie的安全隐患 Session的引进 Session的启用 Session的使用 Session搭配Cookie使用 Cookie的作用 前面我们说道Django实战006:Cookie设置及跨域问题处理,Cookie可以在浏览器端保存用户数据,当用户访问服务器时会提交Cookie给服务器,Cookie附加了当前状态, 服务器可以通过Cookie来标识用户的登录状态,起到简单的用户身份识别和用户信息记录等作用. Cookie登录的实现

  • django 配置阿里云OSS存储media文件的例子

    1. 安装django-aliyun-oss2-storage包 linux上用 pip install django-aliyun-oss2-storage 无报错,顺利安装 windows上报错: (python3_sbs) F:\projects\virtualenv\python3_sbs\Scripts>pip install django-aliyun-oss2-storage Collecting django-aliyun-oss2-storage Using cached dj

  • Vue保持用户登录状态(各种token存储方式)

    目录 怎么设置Cookie Cookie的缺点: LocalStorage与SessionStorage存储Token LocalStorage与SessionStorage的主要区别: Vuex存储Token 为什么要使用Vuex 在前端中,实现保持用户登录状态的方法有很多种,你通过可以存Cookie.Session.Token等信息来保持,不管后台向前端发送哪个我们要做的就是将这些信息存在在本地浏览器中,浏览器再次发送请求时,将设置了'键'='值'的Cookie再次抛给服务器,服务器通过Co

  • formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)

    原理很简单,通过本地存储机制(userData或者localStorage),存储表单中元素的状态到本地. 需要时可以把所存储的状态还原到表单元素上. 其中也用了json数据格式, 之前想对插件中所需的功能,从零开始写,但是觉得太冗余,没必要.就基于另外2个plugin现实. 分别是:jquery.json 和 jStorage. 这两个插件本身实用小巧, api简单易用, 其中jStorage在老一点的浏览器(不支持原生JSON操作)中需要用到jquery.json或者json2 formSt

  • Django中redis的使用方法(包括安装、配置、启动)

    一.安装redis: 1.下载: wget http://download.redis.io/releases/redis-3.2.8.tar.gz 2.解压 tar -zxvf redis-3.2.8.tar.gz 3.复制,放到/usr/local目录下 sudo mv ./redis-3.2.8 /usr/local/redis 4.进入到redis目录下 cd /usr/local/redis/ 5.生成 sudo make 6.测试,时间会比较长 sudo make test 7.安装

  • Django中使用Celery的教程详解

    Django教程 Python下有许多款不同的 Web 框架.Django是重量级选手中最有代表性的一位.许多成功的网站和APP都基于Django. Django是一个开放源代码的Web应用框架,由Python写成. Django遵守BSD版权,初次发布于2005年7月, 并于2008年9月发布了第一个正式版本1.0 . Django采用了MVC的软件设计模式,即模型M,视图V和控制器C. 一.前言 Celery是一个基于python开发的分布式任务队列,如果不了解请阅读笔者上一篇博文Celer

  • Django如何使用jwt获取用户信息

    HTTP请求是无状态的,我们通常会使用cookie或session对其进行状态保持,cookie存储在客户端,容易被用户误删,安全性不高,session存储在服务端,在服务器集群情况下需要解决session不共享的问题,常用的解决方案有4种:客户端Cookie保存.服务器间Session同步.使用集群管理Session.把Session持久化到数据库. jwt:json web token 在用户注册登录后,记录用户登录状态,我们可以用cookie和session来做状态保持,cookie存储在

  • Django+Celery实现定时任务的示例

    目录 一.前言 二.配置使用 定义与触发任务 扩展 三.Django中使用定时任务 二次开发 一.前言 Celery是一个基于python开发的分布式任务队列,而做python WEB开发最为流行的框架莫属Django,但是Django的请求处理过程都是同步的无法实现异步任务,若要实现异步任务处理需要通过其他方式(前端的一般解决方案是ajax操作),而后台Celery就是不错的选择.倘若一个用户在执行某些操作需要等待很久才返回,这大大降低了网站的吞吐量. ​另一方面,当我们需要处理一些定时任务时

随机推荐