首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

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

  •  
  •   lanqing · 256 天前 · 2701 次点击
    这是一个创建于 256 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我想在 django 中的任何一个地方都可以访问这个变量(比如这个变量是一个 list),我能够任意添加和删除变量中的元素,我原本想保存到 redis 中,但是我发现 redis 中好像只能存储字符串类型的,我想保存任意类型的对象到这个变量中,有什么办法么,不吝赐教,非常感谢!
    31 回复  |  直到 2018-11-08 13:00:08 +08:00
        1
    xyxc0673   256 天前 via Android
    可以先序列化了再存进 redis 里
        2
    qq976739120   256 天前
    放到 settings 里去啊
        3
    lanqing   256 天前
    @qq976739120 好像不行
        4
    lanqing   256 天前
    @xyxc0673 用 pickle 可以序列化所有对象么
        5
    absente   256 天前
    为啥要用全局变量?直接序列化存储到合适的地方不就好了。python 有 zodb,erlang 有 ETS。
        6
    absente   256 天前
    zodb 比 pickle 稍微好用一点点,也可以直接存内存
        7
    lolizeppelin   256 天前 via Android
    单例 惰性初始化
        8
    freakxx   256 天前
    @qq976739120
    他应该是要读写,settings 满足不了写这个操作


    你用 redis,可以先 json 进去,出来 loads 下就可以,
    或者用 model 的形式,建一个 config model,然后用 key,value 形式来处理;
        9
    lanqing   256 天前
    @freakxx 我想存储的是 socket 对象,json 序列化好像不可以的
        10
    lanqing   256 天前
    @absente 好的!我会看看这个东西,以前没看到过,谢谢
        11
    absente   256 天前
    @lanqing 我替你试了一下,zodb 也不能存 socket,当然这主要是 picke 本身没有协议支持的原因(硬要支持也不是不可以)。建议还是自己写一个 middleware,把存 socket 的部分分离出来
        12
    absente   256 天前
    pyramid 有一个 non tread safe 的方案可以解决这个问题,django 具体没试过,就不乱发言了。
        13
    zxcvsh   256 天前 via iPhone
    settings
        14
    Hopetree   256 天前
    放到数据库
        15
    jianmingforpc   256 天前 via iPhone
    放 socket 还要修改啊..那看你的 wsgi server 是什么模式的?我觉得单进程的应该放 setting 可以...
        16
    JasperYanky   256 天前 via iPhone
    django solo
        17
    tabris17   256 天前
    任意类型是不可能的。因为操作系统的句柄在不同系统甚至不同进程中都没有意义。可序列化的数据类型还差不多
        18
    fzleee   256 天前
    单进程的话,试试 threadlocal?
        19
    spark   256 天前 via iPhone
    可以环境变量么
        20
    iiduce   256 天前
    这种我就放数据库里。想放任意数据类型要用文件型数据库,我用的是 mongodb。
        21
    lolizeppelin   256 天前 via Android
    都说了用单例模式就行了

    简单点的 Python 模块本身就是单例的
    随便拿个专门模块来放这类变量就完了
        22
    Gothack   256 天前 via iPhone
    processor ?
        23
    lihongjie0209   256 天前
    @fzleee 进程和线程变量有什么关系
        24
    ayang23   256 天前
    简单的回答:不能。
    服务器上跑 Django 一般都是多进程,维护一个可写的全局变量是不可能实现的,用 red is 吧。
        25
    xiaqi   256 天前 via Android
    只有我一个人觉得,他想把句柄存 redis 这种想法是不对嘛?
    他遇到的真正问题应该是,python 在多进程里面获取到其他进程的句柄吧?如果是这样,把进程 id 存到 redis 里,然后其他进程 id 来获取进程句柄,这样不是 ok 嘛?
        26
    largecat   256 天前 via Android
    @ayang23 可以
    在 setting
        27
    lanqing   254 天前
    非常感谢,已经实现
    @lolizeppelin
        28
    xpresslink   254 天前
    @lolizeppelin python 的 web 应用都需要用 uwsgi 或 gunicorn 之类的多进程服务器,进程之间的全局变量实际上是相互隔离的。所有只能用 redis 或 django 的 cache 这种公共存储。
        29
    xpresslink   254 天前
    最省事是用 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!'
        30
    lanqing   254 天前
    @xpresslink 试过了,这样的保存不了 socket 对象哦,只能保存一些 dict list 之类的
        31
    yuoboo   251 天前 via Android
    为什么没有人说存到 session 中呢,那我说一个 session, 或者 cookie
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3960 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 20ms · UTC 01:23 · PVG 09:23 · LAX 18:23 · JFK 21:23
    ♥ Do have faith in what you're doing.