0

0

详解django传递临时数据的方法

高洛峰

高洛峰

发布时间:2017-03-23 14:52:27

|

2055人浏览过

|

来源于php中文网

原创

把最近用到的临时数据传递总结下

有三种方法,cookie,session,cache

先说下对我来说会怎么选,cookie会用理解就行,我不常用,因为用户会关闭cookie,而且需要随着HttpResponse传递,有局限性

session的话也是,在配置时就不选择根据cookie,按照系统默认的数据库就好了

cache放到内存里,用起来方便也简单,就是占内存....,也可以放到库里,根据实际情况考虑吧

下面就是这三种方法的配置和使用了

一: cookie 

  • 获取cookie

HttpRequest.COOKIES

返回一个标准的字典

包含所有的cookie,键值都是str

  • 存储cookie

HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)

max_age 以秒为单位设置保存的时长,当为None时,时长与客户端同步

domain 设置一个跨域的cookie

domain=".lawrence.com" 将设置一个www.lawrence.com、blogs.lawrence.com 和calendars.lawrence.com 都可读的Cookie。否则,Cookie 将只能被设置它的域读取。

可以写成domian=[],不会报错,但是没有测试是否真的可以跨站

 httponly=False 当设置为True时阻止客户端的js读取cookie

  •  删除操作

delete_cookie(key, path='/', domain=None)

删除key指定的cookie,当该cookie不存在时什么也不会发生

当set_cookie指定了path与domain时删除时应保持一致,否则不会删除

  • 其他内容

  因为是一个标准的字典,所以request.COOKIES['key']='value'也可以把内容放到cookie里,但是在传递给下个view的时候值就丢失了

   在一个view中设置的cookie需要传递到下个view才能使用,如:

view1:
  res = HttpResponseRedirect(revers("namespace:name")
  res.set_cookie('key_set', 'value_set_view1', 60)
  # 在这里是没办法获取不到现在的这个cookie
  print(request.COOKIES)
  # 直接设置COOKIES
  COOKIES['key_dict'] = 'values_dict'
  # 这里可以看到上面设置的内容
  print(request.COOKIES)
  return res
  view2: 假设上面的Response就是指向这里的
  print(request.COOKIES)
  # 这里可以看到上面通过set设置的 key_set ,但是通过字典设置的key_dict就没有了

二: 使用session

  在中间件插件集中添加django.contrib.sessions.middleware.SessionMiddleware

django1.10为 MIDDLEWARE,1.08为MIDDLEWARE_CLASSES

并且INSTALLED_APPS中应有'django.contrib.sessions'.

可以将session设置为基于cookie,文件,内存,数据库

  • 基于数据库,将’django.contrib.sessions' 添加到INSTALLED_APPS中

在配置完成之后,运行manage.py migrate 

  • 基于文件设置SESSION_ENGINE为”django.contrib.sessions.backends.file"。

同时可以设置SESSION_FILE_PATH,来指定文件存放位置,否则使用系统默认的值,不修改就是/tmp

  • 基于cookie的会话,不推荐,因为客户可以设置不使用cookie

设置SESSION_ENGINE 为"django.contrib.sessions.backends.signed_cookies"

  • 基于缓存,当设置了缓存并设置缓存存放位置为内存时可以将会话设置为基于缓存的,只有缓存使用session0作为后端时才推荐这样

否则的话还不如直接使用缓存,灵活度更高,负载更小

SESSION_ENGINE 直接设置在setting.py的最外层即可

setting.py

SESSION_ENGINE = “django.contrib.sessions.backends.file"

  • 使用会话

Session 的基类

backends.base.SessionBase

在view中获取session

request.session     获取一个标准的类字典

方法也与字典相同(不使用私有方法)

session['fav_color'] = ‘blue' 设置会话

get(key, default=None)

例如:fav_color = request.session.get('fav_color', 'red')

pop(key)删除该键值对并返回值

例如:fav_color = request.session.pop('fav_color')

keys()

items()

setdefault(key[,default=None])   当key存在时返回对应的值,不存在时将键值对添加到字典并返回默认的值

session1()

特殊方法

session2()

删除当前的会话数据并删除会话的Cookie。当用户注销时可以使用此操作

set_expiry(value) 设置会话超时时长

value可以设置为正session3,datasession4/timedelta,0,None

整数(秒) n秒不操作则过期

datatime/timedelta   该时间点过期    

0  关闭浏览器即过期

None  与全局默认值相同

get_expiry_age()  距离会话过期时长  当会话已过期或未自定义过期信息时返回None

关键字参数

odification:会话的最后一次修改时间,默认为当前  可以传递一个之前或之后的值,判断还有多久过期

expory   自定义的过期信息

get_expiry_session5()  返回过期日期,已过期或未自定义返回cookie的保存时间

get_expire_at_browser_close()

返回True 或False,取决于用户的会话Cookie在用户浏览器关闭时会不会过期。

clear_expired()  类方法  从会话的存储中清除过期的会话。

cycle_key()   创建一个新的会话,同时保留当前的会话数据。

三: 使用缓存

  • 设置缓存(使用内置的后台当内存足够且有必要时可以配置Memcached)

缓存在文件中

CACHES = {

    'default': {

        'BACKEND': 'django.core.cache.backends.filebased.FileBasedCache',

        'LOCATION': ‘/var/tmp/django_cache',   # 文件路径,当在win下改为’c:/tmp/django_cache'

    }

}

路径是绝对路径,是一个目录,需要有当前用户的42(读写)权限

缓存在数据库中

CACHES = {

    'default': {

        'BACKEND': 'django.core.cache.backends.db.DatabaseCache',

        'LOCATION': ‘my_cache_table',   #表名,合法且未使用过即可

    }

}

python manage.py createcachetable  创建缓存表,表名由LOCATION指定

缓存在内存中(默认情况)

CACHES = {

    'default': {

        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',

        'LOCATION': ‘unique-snowflake',  # 存储器 只有当有多个的时需要配置,只有一个内存就不用配置了

    }

}

虚拟缓存:不缓存,但是保留session6用于确保开发生产环境的一致性

CACHES = {

    'default': {

        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',

    }

}

  • 设置CACHES参数

TIMEOUT  超时时间默认session7 即五分钟

VERSION  默认的缓存版本号

Android数据格式解析对象JSON用法 WORD版
Android数据格式解析对象JSON用法 WORD版

本文档主要讲述的是Android数据格式解析对象JSON用法;JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看

下载

OPTIONS: 这个参数应该被传到缓存后端。有效的可选项列表根据缓存的后端不同而不同,由第三方库所支持的缓存将会把这些选项直接配置到底层的缓存库。

缓存的后端实现自己的选择策略 (文件,数据库,内存) 将会履行下面这些选项:

MAX_ENTRIES:高速缓存允许的最大条目数,超出这个数则旧值将被删除. 这个参数默认是300.

CULL_FREQUENCY:当达到MAX_ENTRIES 的时候,被删除的条目比率。 实际比率是 1 / CULL_FREQUENCY, 所以设置CULL_FREQUENCY 为2会在达到MAX_ENTRIES 所设置值时删去一半的缓存。这个参数应该是整数,默认为 3.

把 CULL_FREQUENCY的值设置为 0 意味着当达到MAX_ENTRIES时,缓存将被清空。某些缓存后端 (database尤其)这将以很多缓存丢失为代价.

实例:

缓存在内存中,且超时时长为60*10 600秒,缓存500条,每次删除1/5

CACHES = {

    'default': {

        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',

        'TIMEOUT': 600,

        'OPTIONS': {

            'MAX_ENTRIES': 500,

            'CULL_FREQUENCY': 5

        }     

  }

}

  • 缓存策略: 缓存整站, 缓存view, 缓存模板片段

  • 缓存整站:

setting.py

1.08

MIDDLEWARE_CLASSES = (

    'django.middleware.cache.UpdateCacheMiddleware',

    'django.middleware.common.CommonMiddleware',

    'django.middleware.cache.FetchFromCacheMiddleware',

)

1.10

MIDDLEWARE = [

    'django.middleware.cache.UpdateCacheMiddleware',

    'django.middleware.common.CommonMiddleware',

    'django.middleware.cache.FetchFromCacheMiddleware',

]

注意顺序不要错

然后添加值在setting.py的最外层

CACHE_MIDDLEWARE_ALIAS – 用于存储的缓存的别名,不设置则为’default’

CACHE_MIDDLEWARE_SECONDS –每个page需要被缓存多少秒.

CACHE_MIDDLEWARE_KEY_PREFIX – 如果缓存被使用相同Djangosession8的多个网站所共享,那么把这个值设成当前网站名,或其他能代表这个Django实例的唯一session9,以避免key发生冲突。 如果你不在意的话可以设成空字符串。

单个view缓存

from django.views.decorators.cache import cache_page

@cache_page(60 * 15)

def my_view(request):

    pass

多个 URL 指向同一视图,每个URL将会分别缓存,如:

url(r'^foo/([0-9]{1,2})/$', my_view),

foo/12

foo/13  使用不同的缓存,但是两个12使用同一个

@cache_page(60 * 15, cache=“special_cache")

如: 将会只用指定的缓存

CACHES = {

    'default': {

        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',

        'TIMEOUT': 600,

        'OPTIONS': {

            'MAX_ENTRIES': 500,

            'CULL_FREQUENCY': 5

        }     

  },

    ‘special_cache': {

        'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',

        'TIMEOUT': 600,

        'OPTIONS': {

            'MAX_ENTRIES': 500,

            'CULL_FREQUENCY': 5

        }     

  }

}

在url中指定如何缓存

当需要访问/cache/与/nocache/时,同样指向一个页面,但是一个缓存一个不缓存

可以在url上指定哪个页面缓存,而不是在view上

url(r'^cache/$', cache_page(60 * 15)(my_view), name='cache'),

url(r’^nocache/$',my_view, name='nocache'),

模板缓存

{% load cache %}

{% cache  时长(秒)  名字 %}

{% endcache 名字 %}

更灵活的使用缓存

在views中导入 django.core.cache 的 caches

cad = caches[‘default’]     # 这里的名字与CACHES中的配置一样

cas = caches[‘special_cache’]  

常用的方法

cad.set(‘key’,’value’,时长)  不设时长则取默认值或自定义值

cad.get(‘key’)         key 不存在返回None,也可以指定默认值get(‘key’,’默认值’),没有key则返回’默认值’

cad.add(‘key’,’value’)         当key不存在时增加key-value,当key已存在时不做操作,value还是之前的值

set_many({‘key1’:’v1’,’k2’:’v2’})

get_many([‘key1’,’key2’..])  获取列表中的键的值  返回值为标准字典

delete(‘key’)

delete_many([‘key1’,’key2’]) 当key不存在时

clear() 删除全部缓存

close() 关闭缓存

cad.incr(‘key’,value) 相当于cad[‘key’]+=value  当然,只是相当于,不能这么做

由于底层使用的是cache0_value = value + delta

,那么.当value是’a’,也是可以的,只要是可以使用+的就可以

cad.decr(‘key’,value)  减 ,同上

缓存版本: VERSION 可以传入同样的键,却保存不一样的值,通过version来实现

cad.set(‘key1’,’valu’,version=3) 将key1设为version3,

ca.set('aa','dd',version=3)

ca.set(‘aa','e',version=4)

print(ca.get(‘aa’,version=3))   #=> dd

print(ca.get(‘aa’,version=4))   #=> e

incr_version(‘key’,value) 同样的,value支持+-即可

decr_version(‘key’,value)

但是不推荐直接使用str等,更不推荐使用自己的类

但当确实需要使用自定义的类来填充version时,需要重写的方法有(python3.x)

str

add

sub

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 序列化
Python 序列化

本专题整合了python序列化、反序列化相关内容,阅读专题下面的文章了解更多详细内容。

0

2026.02.02

AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

91

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

27

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

11

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

5

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

5

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

62

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

55

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

27

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.8万人学习

Django DRF 源码解析
Django DRF 源码解析

共21课时 | 1.4万人学习

Django参考手册
Django参考手册

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号