服务端编程(十一)- Django - session 认识会话 cookies

前言 ´・ᴗ・`

  • 本节将讲述HTTP 与 cookies的故事 引出 个性化的页面订制思路——利用cookie存储用户的喜好
  • 本篇内容将会帮助你学习…
    • 1 会话的概念
    • 2 cookie的概念以及简单应用
    • 3 django 会话的函数简要介绍

HTTP背景

看过我之前文章的同志应该不陌生 HTTP是一个无状态(stateless) 的通信协议 意味着当通信断开 除非用户往数据库存了点东西 否则下次用户与网站见面 就好像又不认识了一样
这样的后果显而易见
假设用户喜好某种网站的颜色样式 或者不想某个弹窗再次提醒他干啥
那用户每次打开网页用户都要重新点一遍
用户体验-1

所以 会话以及cookie的概念应运而生

  • 会话session 一个抽象的机制 实现了保存用户相关参数数据
    可以选择会话 将用户数据保存在数据库 或者客户端本地
  • cookie 会话机制的产物 就是—— 存储个性化的用户数据的一些文件
    cookie有生命期 有些生命期只是会话生命期——通信一断就结束 因此cookie并不会在硬盘而是内存中

当然 以前有些网站非常粗心的把重要的信息如账号密码放到cookie中 导致被黑客获取

现在一般方式:
重要数据放db
无关紧要但特别繁杂的放cookie

django的session

还记得 当时配置setting.py 我们装了一些自己都不知道的app admin我们介绍完了 现在是 session

INSTALLED_APPS = [
    ...
    'django.contrib.sessions',
    ....

MIDDLEWARE = [
    ...
    'django.contrib.sessions.middleware.SessionMiddleware',
    ....

由于当时也已经数据库迁移过了 我们现在直接用就好

cookie的本质就是字典 一般在会话期间 我们要是想添加数据到cookie 你只需要知道键(key)的名称:

request.session['my_phone'] = '123456789'

这里我知道key=my_phone 就可以更改

当然更改有个例外 虽然不常用
假设是嵌套的形式 比如这样:

request.session['my_phone']['district_num'] = '0755'

这样的更改是无效的
如果临时需要 加上这句代码:

request.session.modified = True

如果默认一直需要,在setting.py 添加设置来让会话保存每一次修改

SESSION_SAVE_EVERY_REQUEST = True

cookie的应用——记录访问次数

我们在catalog/view.py index主页 加一个render渲染的参数 num_visits

 
    # Number of visits to this view, as counted in the session variable.
    num_visits=request.session.get('num_visits', 0)
    request.session['num_visits'] = num_visits+1
   

注意这句get 意思 有就用上 没有就创建 并且默认值为0
这样可以避免报错 少写一些error捕获

然后修改context

    context = {
        'num_books': num_books,
        'num_instances': num_instances,
        'num_instances_available': num_instances_available,
        'num_authors': num_authors,
        'num_visits': num_visits, 
        # 添加了这句
    }

接下来修改一下模板:catalog/templates/index.html

<p>You have visited this page {{ num_visits }}{% if num_visits == 1 %} time{% else %} times{% endif %}.</p>

这句放哪都行

其他细节

其实我们要使用cookie 为了用户 客户端 还需要有些操作
比如 cookie的设置是以下4个步骤来的

  • 客户端发送一个http请求到服务器端
  • 服务器端发送一个http响应到客户端,其中包含Set-Cookie头部
  • 客户端发送一个http请求到服务器端,其中包含Cookie头部
  • 服务器端发送一个http响应到客户端
    那么正常来说 我们
    先set-cookie请求发出去 发一个test-cookie
    获取浏览器对cookie的支持情况·
    然后删除test cookie
    也就是:
  • set_test_cookie()¶
  • test_cookie_worked()¶
  • delete_test_cookie()¶
    这3个函数

接下来 我们可以用get pop函数对cookie进行增删

  • get(key, default=None)¶
    Example: fav_color = request.session.get(‘fav_color’, ‘red’)

  • pop(key, default=__not_given)¶
    Example: fav_color = request.session.pop(‘fav_color’, ‘blue’)
    get在我们上面的小实例使用到了的

如果不考虑cookie 生命期问题
在用户登出以后 你可以选择清除所有cookie:flush()

如果想设置 获取cookie 生命期(expiry) 用以下函数

  • set_expiry(value)¶

  • get_expiry_age()¶

具体 详见:django session一节

总结 ´◡`

runserver 看下效果:)
在这里插入图片描述
下一节我们看看另一个app authentication 也就是多用户验证的设计
服务端编程(十二)- Django - authentication 认识用户验证

我的其他文章 希望能够帮到你 []( ̄▽ ̄)*


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值