Django设置变量*有时*会重置并且不确定原因

时间:2018-08-22 23:45:00

标签: python django

我在Django settings.py中定义了一个dict,充当所有用户的伪造的临时数据缓存。但是,引起我注意的是,它并没有按照我想要的方式运行,并且似乎是随机地重置为默认值。

settings.py

# initialize with a fake key:value for ease in logging
STORE_DATA = {'hello': 'goodbye'}

views.py

def get_data(name):
        from apiclient.discovery import build

        search_q = name
        service = build('youtube', 'v3', developerKey='<key-here>')
        results = service.search().list(
            part='snippet', 
            channelId='<channel-here>',
            type='video',
            q=search_q,
        ).execute()

        settings.STORE_DATA[name] = results['items']
        result = settings.STORE_DATA[name]
        return result

    page.videos = []
    if page.name in settings.STORE_DATA:
        page.videos = settings.STORE_DATA[page.name]
    else:
        page.videos = get_data(page.name)

这是唯一引用此全局变量的代码。它只是存储youtube api调用的结果,因此我们不必每次有人访问页面时都进行查询。

但是-有时候这行得通,有时却行不通。有时,存储在字典中的key:value对会重置为初始状态。这是我的日志中的一些打印内容-

cache before the call - [u'hello']
"page1" - 2018-08-22 23:23:47
cache after the call - [u'page1', u'hello']

cache before the call - [u'hello']
"page1" - 2018-08-22 23:24:13
cache after the call - [u'page1', u'hello']

cache before the call - [u'page1', u'hello']
page1 - found in cache!
cache after the call - [u'page1', u'hello']

cache before the call - [u'page1', u'hello']
page1 - found in cache!
cache after the call - [u'page1', u'hello']

cache before the call - [u'hello']
"page1" - 2018-08-22 23:27:50
cache after the call - [u'page1', u'hello']

您可以看到第一次,它正确地在缓存中没有数据,因此将其存储。好。第二次...等等。数据不存在。再次存储。第三次和第四次-在那里!真好!第五次-wtf。再次消失。

这太奇怪了,对我来说毫无意义。任何人都知道会发生什么事吗?

1 个答案:

答案 0 :(得分:1)

如果您为uwsgi配置了多个工作程序,则每个工作程序都将拥有自己的Python解释器(每个工作程序将具有单独的字典副本)。因此,建议将单个数据存储用于缓存。

您可以通过将workers(或processors,它们是同义词)设置设置为1来进行测试,以查看是否可以解决问题。