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中文编码问题小结
Sep 28 Python
Python警察与小偷的实现之一客户端与服务端通信实例
Oct 09 Python
python实现微信防撤回神器
Apr 29 Python
详解numpy的argmax的具体使用
May 27 Python
Python qqbot 实现qq机器人的示例代码
Jul 11 Python
Python3的高阶函数map,reduce,filter的示例详解
Jul 23 Python
Django 迁移、操作数据库的方法
Aug 02 Python
Python3搭建http服务器的实现代码
Feb 11 Python
python实现126邮箱发送邮件
May 20 Python
Python实现验证码识别
Jun 15 Python
Python collections.deque双边队列原理详解
Oct 05 Python
python3爬虫中多线程的优势总结
Nov 24 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 park、unpark、ord 函数使用方法(二进制流接口应用实例)
2010/10/19 PHP
浅析is_writable的php实现
2013/06/18 PHP
PHP实现对数组分页处理实例详解
2017/02/07 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
php中加密解密DES类的简单使用方法示例
2020/03/26 PHP
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
显示今天的日期js代码(阳历和农历)
2014/09/30 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
JavaScript内存管理介绍
2015/03/13 Javascript
javascript表单处理具体实现代码(表单、链接、按钮)
2016/05/07 Javascript
require.js+vue开发微信上传图片组件
2016/10/27 Javascript
jq给页面添加覆盖层遮罩的实例
2017/02/16 Javascript
ES6中参数的默认值语法介绍
2017/05/03 Javascript
Vuex 使用 v-model 配合 state的方法
2018/11/13 Javascript
Vue自定义render统一项目组弹框功能
2020/06/07 Javascript
javascript实现时间日期的格式化的方法汇总
2020/08/06 Javascript
python中split方法用法分析
2015/04/17 Python
Python 编码Basic Auth使用方法简单实例
2017/05/25 Python
Python tornado队列示例-一个并发web爬虫代码分享
2018/01/09 Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
2018/01/18 Python
django中forms组件的使用与注意
2019/07/08 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
pytorch实现mnist数据集的图像可视化及保存
2020/01/14 Python
Sunglasses Shop瑞典:欧洲领先的太阳镜网上商店
2018/04/22 全球购物
HolidayLettings英国:预订最好的度假公寓、别墅和自助式住宿
2019/08/27 全球购物
会计主管岗位职责
2014/01/03 职场文书
职工运动会邀请函
2014/02/02 职场文书
感恩节活动策划方案
2014/05/16 职场文书
亮剑精神演讲稿
2014/05/23 职场文书
担保书范本
2015/01/20 职场文书
大学生团日活动总结
2015/05/06 职场文书
公司车辆管理制度
2015/08/04 职场文书
医德医风学习心得体会
2016/01/25 职场文书
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL
使用CSS定位HTML元素的实现方法
2022/07/07 HTML / CSS