django进阶之cookie和session的使用示例


Posted in Python onAugust 17, 2018

Cookies :是浏览器为 Web 服务器存储的一小段信息。 每次浏览器从某个服务器请求页面时,它收到服务器回发送过来的cookies。它保存在浏览器下的某个文件夹下。

Session:Django的Session机制会向请求的浏览器发送cookie字符串。同时也会保存到本地一份,用来验证浏览器登录是否为同一用户。它存在于服务器,Django默认会把session存入到数据库中。

Session依赖于Cookie,如果浏览器不能保存cookies那么session就失效了。因为它需要浏览器的cookie值(sessionid)去session里做对比。session就是用来在服务器端保存用户的会话状态。

django进阶之cookie和session的使用示例

Cookie

1、获取Cookie:

request.COOKIES[key]
request.COOKIES.get(key)
# 普通cookie是明文传输的,可以直接在客户端直接打开,所以需要加盐,解盐之后才能查看
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

参数:

  • default: 默认值
  • salt: 加密盐
  • max_age: 后台控制过期时间

2、设置Cookie:

rep = HttpResponse(...) 或 rep = render(request, ...)
rep.set_cookie(key,value,...)
# 给cookie签名
rep.set_signed_cookie(key,value,salt='加密盐',...)

参数:

  • key, 键
  • value='', 值
  • max_age=None, 超时时间
  • expires=None, 超时时间(IE requires expires, so set it if hasn't been already.)
  • path='/', Cookie生效的路径,/ 表示根路径,特殊的:跟路径的cookie可以被任何url的页面访问
  • domain=None, Cookie生效的域名
  • secure=False, https传输
  • httponly=False True只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖),防止xss攻击

由于cookie保存在客户端的电脑上,所以,JavaScript和jquery也可以操作cookie。

<script src='/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });

Session

Django中默认支持Session,其内部提供了5种类型的Session供开发者使用:

数据库(默认)
缓存
文件
缓存+数据库
加密cookie

1、数据库Session

Django默认支持Session,并且默认是将Session数据存储在数据库中,即:django_session 表中。

a. 配置 settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默认)

SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串(默认)

SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径(默认)

SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默认)

SESSION_COOKIE_SECURE = False # 是否Https传输cookie(默认)

SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输(默认)

SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默认)

SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期(默认)

SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存(默认)

b. 使用

def index(request):
# 获取、设置、删除Session中数据
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在则不设置
del request.session['k1']

# 所有 键、值、键值对
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

# 用户session的随机字符串
request.session.session_key

# 将所有Session失效日期小于当前日期的数据删除
request.session.clear_expired()

# 检查 用户session的随机字符串 在数据库中是否
request.session.exists("session_key")

# 删除当前用户的所有Session数据
request.session.delete("session_key")

2、缓存Session

a. 配置 settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的缓存别名(默认内存缓存,也可以是memcache),此处别名依赖缓存的设置


SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

b. 使用

同上

3、文件Session

a. 配置 settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 缓存文件路径,如果为None,则使用tempfile模块获取一个临时地址tempfile.gettempdir() # 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T


SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在浏览器上时的key,即:sessionid=随机字符串
SESSION_COOKIE_PATH = "/" # Session的cookie保存的路径
SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名
SESSION_COOKIE_SECURE = False # 是否Https传输cookie
SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http传输
SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)
SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否关闭浏览器使得Session过期
SESSION_SAVE_EVERY_REQUEST = False # 是否每次请求都保存Session,默认修改之后才保存

b. 使用

同上

4、缓存+数据库Session

数据库用于做持久化,缓存用于提高效率

a. 配置 settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎

b. 使用

同上

5、加密cookie Session

a. 配置 settings.py

SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎

b. 使用

同上

示例:

from django.shortcuts import render,redirect

# Create your views here.
import datetime

def login(request):
  print("COOKIES",request.COOKIES) #打印cookies 一个字典,里面多个键值对
  print("SESSION",request.session) #session为服务器对应客户信息的键

  if request.method=="POST":
    name=request.POST.get("user")
    pwd=request.POST.get("pwd")
    if name=="yuan" and pwd=="123":

      # ret=redirect("/index/")
      # 给对象ret设置cookie 安全性较差 ,设定有效时间max_age,expires,
      # ret.set_cookie("username",{"11":"22"},max_age=10,expires=datetime.datetime.utcnow()+datetime.timedelta(days=3))
      # return ret

      # COOKIE SESSION一起使用
      # session 以字典存放在服务器端,发给客户端的是数据对应的键,
      request.session["is_login"]=True # 在session中增加键值对
      request.session["user"]=name

      return redirect("/index/")

  return render(request,"login.html")


def index(request):
  if request.COOKIES.get("username",None):  # 取不到设置默认值为None
    name = request.COOKIES.get("username",None)
    return render(request, "index.html", locals())

  # session验证 存在数据库中,所以要先makemigrations生成数据库
  if request.session.get("is_login",None):
    name=request.session.get("user",None)
    return render(request,"index.html",locals())
  else:
    return redirect("/login/")
##session获取
request.session.get("user",None)
# 设置
request.session["user"]=name
# 删除
del request.session.get("user")

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python入门篇之面向对象
Oct 20 Python
实例解析Python的Twisted框架中Deferred对象的用法
May 25 Python
高效测试用例组织算法pairwise之Python实现方法
Jul 19 Python
Python 实现简单的shell sed替换功能(实例讲解)
Sep 29 Python
Python3实现的简单工资管理系统示例
Mar 12 Python
利用 Flask 动态展示 Pyecharts 图表数据方法小结
Sep 04 Python
python set集合使用方法解析
Nov 05 Python
Python高级特性——详解多维数组切片(Slice)
Nov 26 Python
使用python的pyplot绘制函数实例
Feb 13 Python
Python 远程开关机的方法
Nov 18 Python
Python try except else使用详解
Jan 12 Python
numpy实现RNN原理实现
Mar 02 Python
Django 登陆验证码和中间件的实现
Aug 17 #Python
python读取Excel实例详解
Aug 17 #Python
python框架中flask知识点总结
Aug 17 #Python
Flask Web开发入门之文件上传(八)
Aug 17 #Python
python操作excel的方法
Aug 16 #Python
python3调用百度翻译API实现实时翻译
Aug 16 #Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 #Python
You might like
PHP __autoload函数(自动载入类文件)的使用方法
2012/02/04 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
Symfony的安装和配置方法
2016/03/17 PHP
JS获取scrollHeight问题想到的标准问题
2007/05/27 Javascript
jQuery hover 延时器实现代码
2011/03/12 Javascript
javascript去掉前后空格的实例
2013/11/07 Javascript
使用js简单实现了tree树菜单
2013/11/20 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
php+js实现倒计时功能
2014/06/02 Javascript
javascript中slice(),splice(),split(),substring(),substr()使用方法
2015/03/13 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
jquery+CSS3模拟Path2.0动画菜单效果代码
2015/08/31 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
2015/10/23 Javascript
js中遍历对象的属性和值的方法
2016/07/27 Javascript
Angularjs 与 bower安装和使用详解
2017/05/11 Javascript
vue子父组件通信的实现代码
2017/07/09 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
原生JavaScript实现轮播图
2021/01/10 Javascript
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
Python实现简单的HttpServer服务器示例
2017/09/25 Python
Python将多个list合并为1个list的方法
2018/06/27 Python
如何利用Python开发一个简单的猜数字游戏
2019/09/22 Python
python中使用you-get库批量在线下载bilibili视频的教程
2020/03/10 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
Python字典fromkeys()方法使用代码实例
2020/07/20 Python
python3 中使用urllib问题以及urllib详解
2020/08/03 Python
世界上最大的在线汽车租赁预订平台:Rentalcars.com(支持中文)
2018/10/12 全球购物
列车长先进事迹材料
2014/01/25 职场文书
如何写早恋检讨书
2014/09/10 职场文书
2014年民政局关于保密工作整改措施
2014/09/19 职场文书
公安四风对照检查材料思想汇报
2014/10/11 职场文书
外贸业务员岗位职责
2015/02/13 职场文书
致青春观后感
2015/06/09 职场文书
golang中的空slice案例
2021/04/27 Golang
Python echarts实现数据可视化实例详解
2022/03/03 Python