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获取apk文件URL地址实例
Nov 01 Python
Python ftp上传文件
Feb 13 Python
Python3控制路由器——使用requests重启极路由.py
May 11 Python
批量获取及验证HTTP代理的Python脚本
Apr 23 Python
Python 文件操作的详解及实例
Sep 18 Python
python实现在pandas.DataFrame添加一行
Apr 04 Python
Python 数据库操作 SQLAlchemy的示例代码
Feb 18 Python
python 实现线程之间的通信示例
Feb 14 Python
Python中logging日志库实例详解
Feb 19 Python
基于Python数据分析之pandas统计分析
Mar 03 Python
python实现猜拳游戏
Mar 04 Python
pycharm 对代码做静态检查操作
Jun 09 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 AJAX实例根据邮编自动完成地址信息
2008/11/23 PHP
php统计时间和内存使用情况示例分享
2014/03/13 PHP
php根据一个给定范围和步进生成数组的方法
2015/06/19 PHP
常见的四种POST 提交数据方式(小总结)
2015/10/08 PHP
PHP会话控制实例分析
2016/12/24 PHP
javascript 操作cookies及正确使用cookies的属性
2009/10/15 Javascript
js列举css中所有图标的实现代码
2011/07/04 Javascript
详解JavaScript语法对{}处理的坑爹之处
2014/06/05 Javascript
jQuery标签编辑插件Tagit使用指南
2015/04/21 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
three.js实现圆柱体
2018/12/30 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
如何根据业务封装自己的功能组件
2019/04/19 Javascript
vue 实现LED数字时钟效果(开箱即用)
2019/12/08 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
python根据出生年份简单计算生肖的方法
2015/03/27 Python
Python基本语法经典教程
2016/03/11 Python
Python实现的圆形绘制(画圆)示例
2018/01/31 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
对Python 数组的切片操作详解
2018/07/02 Python
python交互界面的退出方法
2019/02/16 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
Django使用中间件解决前后端同源策略问题
2019/09/02 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
普通党员对照检查材料
2014/09/24 职场文书
不服从公司安排检讨书
2014/09/24 职场文书
个人汇报材料范文
2014/12/30 职场文书
车队安全员岗位职责
2015/02/15 职场文书
2015年行政部工作总结
2015/04/28 职场文书
企业党建工作总结2015
2015/05/26 职场文书
Python+tkinter实现高清图片保存
2022/03/13 Python
灵能百分百第三季什么时候来?
2022/03/15 日漫