django 中如何维护一个全局变量

2018-11-03 11:37:30 +08:00
 lanqing
我想在 django 中的任何一个地方都可以访问这个变量(比如这个变量是一个 list),我能够任意添加和删除变量中的元素,我原本想保存到 redis 中,但是我发现 redis 中好像只能存储字符串类型的,我想保存任意类型的对象到这个变量中,有什么办法么,不吝赐教,非常感谢!
6860 次点击
所在节点    Python
32 条回复
lolizeppelin
2018-11-03 14:32:14 +08:00
都说了用单例模式就行了

简单点的 Python 模块本身就是单例的
随便拿个专门模块来放这类变量就完了
Gothack
2018-11-03 15:09:28 +08:00
processor ?
lihongjie0209
2018-11-03 15:25:57 +08:00
@fzleee 进程和线程变量有什么关系
ayang23
2018-11-03 16:01:58 +08:00
简单的回答:不能。
服务器上跑 Django 一般都是多进程,维护一个可写的全局变量是不可能实现的,用 red is 吧。
xiaqi
2018-11-03 16:29:08 +08:00
只有我一个人觉得,他想把句柄存 redis 这种想法是不对嘛?
他遇到的真正问题应该是,python 在多进程里面获取到其他进程的句柄吧?如果是这样,把进程 id 存到 redis 里,然后其他进程 id 来获取进程句柄,这样不是 ok 嘛?
largecat
2018-11-03 16:48:25 +08:00
@ayang23 可以
在 setting
lanqing
2018-11-05 10:01:01 +08:00
非常感谢,已经实现
@lolizeppelin
xpresslink
2018-11-05 10:14:18 +08:00
@lolizeppelin python 的 web 应用都需要用 uwsgi 或 gunicorn 之类的多进程服务器,进程之间的全局变量实际上是相互隔离的。所有只能用 redis 或 django 的 cache 这种公共存储。
xpresslink
2018-11-05 10:21:24 +08:00
最省事是用 Django 的缓存

CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache',
'LOCATION': 'global-variables'
}
}

>>> from django.core.cache import cache
>>> cache.set('my_key', 'hello, world!', 30)
>>> cache.get('my_key')
'hello, world!'
lanqing
2018-11-05 11:32:33 +08:00
@xpresslink 试过了,这样的保存不了 socket 对象哦,只能保存一些 dict list 之类的
yuoboo
2018-11-08 13:00:08 +08:00
为什么没有人说存到 session 中呢,那我说一个 session, 或者 cookie
piaochen0
2019-08-28 16:05:40 +08:00
@lanqing 麻烦问下楼主最终是怎么解决这个问题的?是用单例的模式?单例模式不是在 uwsgi 或 gunicorn 的多进程实例间不能共享的吗?麻烦赐教。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/504042

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX