def wrapper(*args, **kwargs):
     key = self._make_cache_key(fn, args, kwargs)
     value = memcached.get(key)
     if value:
         value = MemorizedObject(value)
         value.from_cache = True
     else:
         value = fn(*args, **kwargs)
         memcached.set(key, value, time=self.ttl)
         value = MemorizedObject(value)
     value.cache_key = key
     return value
 def wrapper(*args, **kwargs):
     key = self._make_cache_key(fn, args, kwargs)
     value = memcached.get(key)
     if value:
         value = MemorizedObject(value)
         value.from_cache = True
     else:
         # TODO: kick off a task here, instead of calculating the value.
         # https://github.com/mozilla/universal-search-recommendation/issues/11
         value = fn(*args, **kwargs)
         memcached.set(key, value, time=self.ttl)
         if self.error_on_miss:
             raise CacheMissError()
         value = MemorizedObject(value)
     value.cache_key = key
     return value
def main():
    q = request.args.get('q')
    if not q:
        abort(400)
    key = '_'.join([
        conf.KEY_PREFIX,
        hashlib.md5(str(q).encode('utf-8')).hexdigest()
    ])
    try:
        response = memcached.get(key)
    except Exception as e:
        if application.config['DEBUG']:
            return jsonify({e.__class__.__name__: e.args}), 500
        return jsonify({}), 500
    if not response:
        recommend.delay(q, key)
        return jsonify({}), 202
    else:
        return jsonify(response), 200