推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
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
lanqing
V2EX  ›  Python

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

  •  
  •   lanqing · Nov 3, 2018 · 7767 views
    This topic created in 2765 days ago, the information mentioned may be changed or developed.
    我想在 django 中的任何一个地方都可以访问这个变量(比如这个变量是一个 list),我能够任意添加和删除变量中的元素,我原本想保存到 redis 中,但是我发现 redis 中好像只能存储字符串类型的,我想保存任意类型的对象到这个变量中,有什么办法么,不吝赐教,非常感谢!
    32 replies    2019-08-28 16:05:40 +08:00
    xyxc0673
        1
    xyxc0673  
       Nov 3, 2018 via Android
    可以先序列化了再存进 redis 里
    qq976739120
        2
    qq976739120  
       Nov 3, 2018
    放到 settings 里去啊
    lanqing
        3
    lanqing  
    OP
       Nov 3, 2018
    @qq976739120 好像不行
    lanqing
        4
    lanqing  
    OP
       Nov 3, 2018
    @xyxc0673 用 pickle 可以序列化所有对象么
    absente
        5
    absente  
       Nov 3, 2018
    为啥要用全局变量?直接序列化存储到合适的地方不就好了。python 有 zodb,erlang 有 ETS。
    absente
        6
    absente  
       Nov 3, 2018
    zodb 比 pickle 稍微好用一点点,也可以直接存内存
    lolizeppelin
        7
    lolizeppelin  
       Nov 3, 2018 via Android
    单例 惰性初始化
    metamask
        8
    metamask  
       Nov 3, 2018
    @qq976739120
    他应该是要读写,settings 满足不了写这个操作


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

    简单点的 Python 模块本身就是单例的
    随便拿个专门模块来放这类变量就完了
    Gothack
        22
    Gothack  
       Nov 3, 2018 via iPhone
    processor ?
    lihongjie0209
        23
    lihongjie0209  
       Nov 3, 2018
    @fzleee 进程和线程变量有什么关系
    ayang23
        24
    ayang23  
       Nov 3, 2018
    简单的回答:不能。
    服务器上跑 Django 一般都是多进程,维护一个可写的全局变量是不可能实现的,用 red is 吧。
    xiaqi
        25
    xiaqi  
       Nov 3, 2018 via Android
    只有我一个人觉得,他想把句柄存 redis 这种想法是不对嘛?
    他遇到的真正问题应该是,python 在多进程里面获取到其他进程的句柄吧?如果是这样,把进程 id 存到 redis 里,然后其他进程 id 来获取进程句柄,这样不是 ok 嘛?
    largecat
        26
    largecat  
       Nov 3, 2018 via Android
    @ayang23 可以
    在 setting
    lanqing
        27
    lanqing  
    OP
       Nov 5, 2018
    非常感谢,已经实现
    @lolizeppelin
    xpresslink
        28
    xpresslink  
       Nov 5, 2018
    @lolizeppelin python 的 web 应用都需要用 uwsgi 或 gunicorn 之类的多进程服务器,进程之间的全局变量实际上是相互隔离的。所有只能用 redis 或 django 的 cache 这种公共存储。
    xpresslink
        29
    xpresslink  
       Nov 5, 2018
    最省事是用 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
        30
    lanqing  
    OP
       Nov 5, 2018
    @xpresslink 试过了,这样的保存不了 socket 对象哦,只能保存一些 dict list 之类的
    yuoboo
        31
    yuoboo  
       Nov 8, 2018 via Android
    为什么没有人说存到 session 中呢,那我说一个 session, 或者 cookie
    piaochen0
        32
    piaochen0  
       Aug 28, 2019
    @lanqing 麻烦问下楼主最终是怎么解决这个问题的?是用单例的模式?单例模式不是在 uwsgi 或 gunicorn 的多进程实例间不能共享的吗?麻烦赐教。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2577 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 79ms · UTC 01:12 · PVG 09:12 · LAX 18:12 · JFK 21:12
    ♥ Do have faith in what you're doing.