奇葩问题:Django中使用memcached,能写入数据,不能读取数据

13 篇文章 6 订阅
10 篇文章 6 订阅

今天在使用Django操作memcached的时候,遇到个极其奇葩的问题。数据能写入memcached,但是无法读取出来。

上代码:

setting.py

CACHE = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': '127.0.0.1:11211',
    }
}

上面这是memcached配置

下面是自定义的一个manage.py的命令

from django.core.management.base import BaseCommand
from django.core.cache import cache

from utils.myrandom import get_random_char


class Command(BaseCommand):
    def handle(self, *args, **options):
        char = get_random_char(6)
        cache.set('auth_code', char, timeout=300)
        print('生成的授权码为:', cache.get('auth_code'))

我的目的是利用manage.py命令来创建一个授权码,保存到memcached中。

在这里,创建了一个随机的6位长度的字符串,保存到memcached中,并且读取它,然后显示出来

在这里确实是生成了,并且获取成功!但是到表单验证的时候,就不行了。这里是验证的一部分

from django.core.cache import cache
    
def clean_code(self):
    code = self.cleaned_data.get('code')
    print('获取到的数据为:', code)
    print('数据库中的数据为:', cache.get('auth_code'))
    if cache.get('auth_code') != code:
        raise forms.ValidationError('授权码错误!')
    return code

表单验证时执行的结果

很明显,没有获取到memcached中的数据,不光是验证,我在视图中也试过了,也是没法获取到。

同样的代码,在不一样的地方就获取不到数据了,要它有何用?

百度了1小时,多次尝试之后。也没找到问题所在,最后在Django源代码中找到了问题所在。

源码就不完全弄出来了,截取一部分:

class CacheHandler:
    ......
    def __init__(self):
        self._caches = local()

    def __getitem__(self, alias):
       ......

        if alias not in settings.CACHES:
            raise InvalidCacheBackendError(
                "Could not find config for '%s' in settings.CACHES" % alias
            )

        cache = _create_cache(alias)
        self._caches.caches[alias] = cache
        return cache

重点就在这个 if 语句:


if alias not in settings.CACHES:
    raise InvalidCacheBackendError(
        "Could not find config for '%s' in settings.CACHES" % alias
    )

看出来了吧!!!

 

卧槽,我配置中少写了个 "S"

 但是明明配置都不对了,为什么数据还添加进去了呢?而且还读取出来显示到终端了。

我的猜测:cache是一个对象,我set的时候是给这个对象增加了一个属性并且设置了一个值,但是并没有放入数据库中,这是一个局部变量,我get的时候又取出了这个局部变量。所有当我在别的文件中get的时候,获取不到结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值