Python中在Django框架下如何维护一个全局变量?
我想在 django 中的任何一个地方都可以访问这个变量(比如这个变量是一个 list),我能够任意添加和删除变量中的元素,我原本想保存到 redis 中,但是我发现 redis 中好像只能存储字符串类型的,我想保存任意类型的对象到这个变量中,有什么办法么,不吝赐教,非常感谢!
Python中在Django框架下如何维护一个全局变量?
可以先序列化了再存进 redis 里
在Django里搞全局变量,你得绕开global,那玩意儿在WSGI多线程环境里不靠谱。核心思路是利用Django的应用配置对象,它就是个单例,在整个应用生命周期内都有效。
最直接的办法是在settings.py里定义。比如,你想存个全局计数器:
# settings.py
MY_GLOBAL_COUNTER = 0
然后在视图或其他地方用:
# views.py
from django.conf import settings
def my_view(request):
settings.MY_GLOBAL_COUNTER += 1
# ... 其他操作
但注意,直接修改settings在部署时可能会有问题(比如多进程时变量不共享)。更健壮的做法是用缓存(如django.core.cache)或者数据库。不过如果只是应用级别的简单全局状态,用settings或者模块变量也行,就是得心里有数它在多进程部署时是隔离的。
总结:用settings.py或模块级变量,但要清楚多进程时的限制。
放到 settings 里去啊
好像不行
用 pickle 可以序列化所有对象么
为啥要用全局变量?直接序列化存储到合适的地方不就好了。python 有 zodb,erlang 有 ETS。
zodb 比 pickle 稍微好用一点点,也可以直接存内存
单例 惰性初始化
他应该是要读写,settings 满足不了写这个操作
你用 redis,可以先 json 进去,出来 loads 下就可以,
或者用 model 的形式,建一个 config model,然后用 key,value 形式来处理;
我想存储的是 socket 对象,json 序列化好像不可以的
好的!我会看看这个东西,以前没看到过,谢谢
我替你试了一下,zodb 也不能存 socket,当然这主要是 picke 本身没有协议支持的原因(硬要支持也不是不可以)。建议还是自己写一个 middleware,把存 socket 的部分分离出来
pyramid 有一个 non tread safe 的方案可以解决这个问题,django 具体没试过,就不乱发言了。
settings
放到数据库
放 socket 还要修改啊…那看你的 wsgi server 是什么模式的?我觉得单进程的应该放 setting 可以…
django solo
任意类型是不可能的。因为操作系统的句柄在不同系统甚至不同进程中都没有意义。可序列化的数据类型还差不多
单进程的话,试试 threadlocal?
可以环境变量么
这种我就放数据库里。想放任意数据类型要用文件型数据库,我用的是 mongodb。
都说了用单例模式就行了
简单点的 Python 模块本身就是单例的
随便拿个专门模块来放这类变量就完了
processor ?
进程和线程变量有什么关系
简单的回答:不能。
服务器上跑 Django 一般都是多进程,维护一个可写的全局变量是不可能实现的,用 red is 吧。
只有我一个人觉得,他想把句柄存 redis 这种想法是不对嘛?
他遇到的真正问题应该是,python 在多进程里面获取到其他进程的句柄吧?如果是这样,把进程 id 存到 redis 里,然后其他进程 id 来获取进程句柄,这样不是 ok 嘛?
可以
在 setting
非常感谢,已经实现
python 的 web 应用都需要用 uwsgi 或 gunicorn 之类的多进程服务器,进程之间的全局变量实际上是相互隔离的。所有只能用 redis 或 django 的 cache 这种公共存储。
最省事是用 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!’
试过了,这样的保存不了 socket 对象哦,只能保存一些 dict list 之类的
为什么没有人说存到 session 中呢,那我说一个 session, 或者 cookie
麻烦问下楼主最终是怎么解决这个问题的?是用单例的模式?单例模式不是在 uwsgi 或 gunicorn 的多进程实例间不能共享的吗?麻烦赐教。

