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中urllib+urllib2+cookielib模块编写爬虫实战
Jan 20 Python
使用Mixin设计模式进行Python编程的方法讲解
Jun 21 Python
不要用强制方法杀掉python线程
Feb 26 Python
Python数据结构之顺序表的实现代码示例
Nov 15 Python
python奇偶行分开存储实现代码
Mar 19 Python
用python代码将tiff图片存储到jpg的方法
Dec 04 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
python使用百度文字识别功能方法详解
Jul 23 Python
Python使用ffmpy将amr格式的音频转化为mp3格式的例子
Aug 08 Python
python pprint模块中print()和pprint()两者的区别
Feb 10 Python
找Python安装目录,设置环境路径以及在命令行运行python脚本实例
Mar 09 Python
Python截图并保存的具体实例
Jan 14 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 5.3.0 安装分析心得
2009/08/07 PHP
PHP取得一个类的属性和方法的实现代码
2011/05/22 PHP
PHP curl_setopt()函数实例代码与参数分析
2011/06/02 PHP
PHP框架Swoole定时器Timer特性分析
2014/08/19 PHP
Nginx下配置codeigniter框架方法
2015/04/07 PHP
PHP多个图片压缩成ZIP的方法
2020/08/18 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
2018/11/22 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
Gambit vs ForZe BO3 第二场 2.13
2021/03/10 DOTA
javascript下过滤数组重复值的代码
2007/09/10 Javascript
JAVASCRIPT  THIS详解 面向对象
2009/03/25 Javascript
JS 常用校验函数
2009/03/26 Javascript
Javascript的setTimeout()使用闭包特性时需要注意的问题
2014/09/23 Javascript
javascript实现状态栏文字首尾相接循环滚动的方法
2015/07/22 Javascript
浅谈js中的in-for循环
2016/06/28 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
基于Vue.js实现tab滑块效果
2017/07/23 Javascript
laydate日历控件使用方法详解
2017/11/20 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
JS实现小星星特效
2019/12/24 Javascript
[46:12]完美世界DOTA2联赛循环赛 DM vs Matador BO2第一场 11.04
2020/11/04 DOTA
人脸识别经典算法一 特征脸方法(Eigenface)
2018/03/13 Python
如何在VSCode上轻松舒适的配置Python的方法步骤
2019/10/28 Python
详解python环境安装selenium和手动下载安装selenium的方法
2020/03/17 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
python使用matplotlib的savefig保存时图片保存不完整的问题
2021/01/08 Python
印度最大的酒店品牌网络:OYO Rooms
2016/07/24 全球购物
Pop In A Box英国:Funko POP搪胶公仔
2019/05/27 全球购物
日本化妆品植村秀俄罗斯官方网站:Shu Uemura俄罗斯
2020/02/01 全球购物
精选干货:Java精选笔试题附答案
2014/01/18 面试题
军训自我鉴定100字
2014/02/13 职场文书
细节决定成败演讲稿
2014/05/12 职场文书
出生证明格式
2015/06/15 职场文书
正确的理解和使用Django信号(Signals)
2021/04/14 Python
tree shaking对打包体积优化及作用
2022/07/07 Java/Android