2015-01-25 12 views
-1

У нас есть небольшое приложение для Google App Engine на Python, и мы используем memcache. Но ключи memcache остаются даже после memcache.delete, а также memcache возвращает число (0), когда я ожидаю, что он вернет строку («undefined»). Вот мой код:memcache не работает должным образом

check_feature.py:

import sys 
sys.path.insert(0, 'libs') 

import webapp2 
import json 
from google.appengine.api import memcache 
from models.shard_counter import GeneralCounterShard 
from models.check_feature_limit import CheckFeatureLimit 


class CheckFeatureHandler(webapp2.RequestHandler): 
    def get_number_of_users_enabled(self, feature_name): 
     """ 
     Get the number of users enabled for the given feature name. 
     """ 
     number_of_users_enabled_undefined = "undefined" 
     number_of_users_enabled = memcache.get(key=feature_name) 
     if (number_of_users_enabled is None): 
      check_feature_limit = None 
      check_feature_limits = CheckFeatureLimit.gql("WHERE feature_name=:1 ORDER BY last_modified DESC LIMIT 1", feature_name) 
      if (check_feature_limits.count() > 0): 
       check_feature_limit = check_feature_limits.get() 
      if (check_feature_limit): 
       number_of_users_enabled = check_feature_limit.number_of_users_enabled 
      if (number_of_users_enabled is None): 
       number_of_users_enabled = number_of_users_enabled_undefined 
      memcache.add(key=feature_name, value=number_of_users_enabled, time=3600) 
     if (number_of_users_enabled == number_of_users_enabled_undefined): 
      number_of_users_enabled = None 
     return number_of_users_enabled 

admin.py:

import sys 
sys.path.insert(0, 'libs') 

import webapp2 
import json 
import requests 
from google.appengine.ext.webapp import template 
from google.appengine.api import memcache 
from models.shard_counter import GeneralCounterShard 
from models.check_feature_limit import CheckFeatureLimit 

template.register_template_library("tags.tags") 


class AdminHandler(webapp2.RequestHandler): 
    def get(self): 
     self.post() 

    def post(self): 
     params = {} 
     number_of_users_enabled_dict = {} 
     number_of_users_dict = {} 
     r = requests.get(url="http://jsons.[part_of_link_suppressed].com.s3.amazonaws.com/flags.json") 
     flags = json.loads(r.text) 
     if ((flags) and ("depending_on_counter" in flags) and (len(flags["depending_on_counter"]) > 0)): 
      for feature_name in flags["depending_on_counter"]: 
       check_feature_limit = None 
       check_feature_limits = CheckFeatureLimit.gql("WHERE feature_name=:1 ORDER BY last_modified DESC LIMIT 1", feature_name) 
       if (check_feature_limits.count() > 0): 
        check_feature_limit = check_feature_limits.get() 
       number_of_users_enabled = self.request.get(feature_name + "_number_of_users_enabled") 
       if (number_of_users_enabled): 
        number_of_users_enabled = int(number_of_users_enabled) 
        if (not(check_feature_limit)): 
         check_feature_limit = CheckFeatureLimit(feature_name=feature_name) 
        check_feature_limit.number_of_users_enabled = number_of_users_enabled 
        check_feature_limit.put() 
        memcache.delete(key=feature_name) # I don't think it works. 
       number_of_users_enabled = None 
       if (check_feature_limit): 
        number_of_users_enabled = check_feature_limit.number_of_users_enabled 
       if (not(number_of_users_enabled is None)): 
        number_of_users_enabled_dict[feature_name] = number_of_users_enabled 
       number_of_users = GeneralCounterShard.get_count(feature_name) 
       number_of_users_dict[feature_name] = number_of_users 
      params["depending_on_counter"] = flags["depending_on_counter"] 
      params["number_of_users_enabled_dict"] = number_of_users_enabled_dict 
      params["number_of_users_dict"] = number_of_users_dict 
     html = template.render("admin/admin.html", params) 
     self.response.out.write(html) 

app = webapp2.WSGIApplication([ 
    ("/admin", AdminHandler) 
], debug=True) 

Значения test_counter_feature_1 (Количество пользователей, позволяющих) 2, test_counter_feature_2 это 4, а test_counter_feature_3 не определено (нет объекта), но в memcache значения равны 2, 3 и 0 соответственно, даже после сохранения формы (и, следовательно, memcache shoul d). В чем проблема? Я ожидаю, что значение test_counter_feature_3 будет «неопределенным», а не 0. И еще два значения должны быть удалены после сохранения формы.

+1

Можете ли вы уменьшить это до минимального теста? Я не думаю, что здесь нужен весь проект. –

+0

@MartijnPieters Хорошо, я удалил ненужный код. Пожалуйста, сосредоточьтесь на строках, содержащих «memcache», особенно «memcache.delete». – Uri

+0

Это еще далеко от минимального теста. –

ответ

1

ОК, я нашел проблему. GeneralCounterShard также сохранил тот же ключ в memcache, поэтому я переименовал ключ, и все работает сейчас. Новый ключ - feature_name + "_number_of_users_enabled", а не feature_name, как раньше. Поэтому я заменил все вызовы memcache новым ключом, и теперь он работает. Спасибо!

Смежные вопросы