Django 使用会话( sessions )功能

题图:by kacozi from Instagram

淘宝、天猫、京东等电商网站的出现,让我们足不出户就能购物。在这些网站中,都有一个“购物车”的功能。当我们在不同商品页面将商品加入购物车,然后关闭浏览器。等下次浏览该网站时,我们会依然发现购物车的商品还在。这是怎么实现的了?类似这种场景,一般都是采用 Cookie + Session 方式来实现。

1 Cookie 机制

HTTP 协议是无状态的。所以服务器无法根据 HTTP 协议来辨别多个 HTTP 请求来自哪个用户。在实际场景中,服务器经常需要追踪客户端的状态。为了解决这个问题, Cookie 技术应运而生。

cookie 一开始是服务器产生的一段随机字符串。它的主要内容包括:名字,值,过期时间,路径与域等信息。然后服务器将其发送给客户端。在后续的请求中,cookie 会附在请求资源的 HTTP 请求头上,发送给服务器。

2 Session 机制

如果不涉及用户登录等敏感信息时,Cookie 能够满足大部分的场景需求。而客户端(如浏览器)会将 Cookie 是保存在硬盘中。如果用户登录敏感信息保存到 cookie 中,会存在安全性问题。因为当 HTTP 请求被黑客拦截,然后劫持 cookie 信息。黑客就可以凭借该 cookie 登录对应的网站。

Session 的出现很好地解决的这个问题。Session 机制是一个服务器端的机制。它会将信息保存服务器端,跟客户端通信只需要一个随机的字符串 session_id。如果客户端没有禁止 Cookie 功能,session_id 通常是保存在 Cookie中 的。如果 Cookie 被禁用,它则可能通过为 url 加上query string 来添加 session_id。

3 在 Django 中的应用

Django 为我们提供了一个通用的 Session 框架。使用 Django 2.X 版本创建新项目的时,Django 默认会帮我们启用该功能。

Django 默认 Session 数据保存到数据库中,可以在 settings.py 中看到配置信息项目。

INSTALLED_APPS = [
    # 启用 sessions 应用
    'django.contrib.sessions',
]

MIDDLEWARE = [
    # 启用 Session 中间层
    'django.contrib.sessions.middleware.SessionMiddleware',
]

然后我们在将自带组件的模型同步到数据库中。如果你还不熟悉这块内容,可以阅读《Django 学习笔记之模型(上)》这篇文章。我们之后会看到数据库中有个 django_session 表:

点击查看大图

除了上述的基于数据库的会话,Django 还提供另外三种方法:
1)保存到缓存中
如果你的场景需要快速存储会话,可以选择该方案。使用之前,需要配置下 Django 的缓存框架。在 settings.py 中增加 SESSION_ENGINE 配置。

这其中也是有两种保存数据的方案,具体配置如下:

  • 方案一
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

这种配置方案 Django 只是简单保存会话。同时,这种方案持久性不好。因为当缓存数据存满时将清除部分数据,或者遇到缓存服务器重启时数据将丢失。

  • 方案二
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

这种方案既保证快速存储会话数据,又保证数据持久性。因为该使用方案, Session 在保存到缓存的同时还会被保存到数据库中,当 Django 在缓存中找不到Session 时,会从数据库中找到。因此,这种方案的性能开销会比方案一大。

如果我们在工程中同时配置了数据库会话和缓存会话,Django 默认优秀选择缓存会话。

2)保存到文件中
这种方案是保存数据到本地磁盘中。因为磁盘的 I/O 瓶颈问题,导致这种方案存储数据效率不是很高。如果要使用这种方案,在 settings.py 中增加 SESSION_ENGINE 配置。具体配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# 可选配置
SESSION_FILE_PATH = '/monkey/www/'

SESSION_FILE_PATH 默认使用 tempfile.gettempdir() 方法的返回值,就像 /tmp目录。如果你想更新文件的保存路径,可以手动指定。另外需确保你的文件存储目录,以及 Web 服务器对该目录具有读写权限。

3)保存到 cookie 中
这种方案将数据保存到 cookie 中。这种方案适用于对数据保密性不严格的场景。如果要使用这种方案,在 settings.py 中增加 SESSION_ENGINE 配置。具体配置如下:

SESSION_ENGINE = 'jango.contrib.sessions.backends.signed_cookies'
# 建议配置,阻止 javascript 对会话数据的访问,提高安全性。
SESSION_COOKIE_HTTPONLY= True

往前 Django 学习笔记文章
Django 学习笔记之环境搭建
Django 学习笔记之初始
Django 学习笔记之视图与URL配置
Django 学习笔记之模板
Django 学习笔记之模型(上)
Django 学习笔记之模型(下)
Django 学习笔记之后台管理
Django 学习笔记之模型表单
Django 学习笔记之使用旧数据库
Django 实战1:搭建属于自己社工查询系统(上)
Django 实战1:搭建属于自己社工查询系统(下)
Django 学习笔记之模型高级用法(上)
Django 学习笔记之模型高级用法(下)
Django 实现分页功能


本文原创发布于微信公众号「极客猴」,欢迎关注第一时间获取更多原创分享

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容

  • 版权: https://github.com/haiiiiiyun/awesome-django-cn Aweso...
    若与阅读 22,995评论 3 241
  • 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Se...
    chinariver阅读 5,593评论 1 49
  • 限行,这时髦玩意我算是赶上了!担心带给自己不便的同时,也有点改变惯常的小小激动,说小惊喜也不为过。不管怎么样,...
    简亦子阅读 307评论 1 0
  • 今天我看了的≤小屁孩日记≥这部电影。这部电影讲的是,一个小男孩,他叫格雷格,是一位美国人。这个故事就发生在他的中...
    朱朱恒阅读 542评论 2 1
  • 虽然没有月亮, 夜晚也发着光, 不是灯笼霓虹相辉, 也非烛火觥筹交错, 只因你身旁,我明亮。
    洛钧寒阅读 308评论 0 1