将Memcached与Flask蓝图一起使用

时间:2018-08-28 19:08:02

标签: flask docker-compose memcached

在应用程序上下文中,我似乎无法在memcached中设置对象。日志表明我已连接到memcached,但是当我尝试设置对象时,设置函数将返回“ 0”或False。在应用程序上下文之外,我可以连接到服务器IP和端口,并轻松获取和设置对象。这是我的设置:

应用程序/ __ init __。py

class App(Flask):

def __init__(self):
    super(App, self).__init__(__name__)
    self.config.from_object('app.config')
    self.config.from_object('app.deployments.Prod')
    logging.basicConfig(filename=self.config['LOG_PATH'] + config.LOG_FILE, level=logging.INFO, format=config.LOG_FORMAT, datefmt='%m/%d/%Y %I:%M:%S')
    self.static_folder=config.STATICS
    self.before_request(self.init_dbs)
    self.teardown_request(self.teardown)
    self.after_request(self.teardown)
    try:
        self.init_session()
        self.init_login()
        self.init_templates()
    except Exception as e:
        logging.info(e)

def init_dbs(self):
    g.ES = init_elasticsearch(hosts=self.config['ES_HOSTS'])
    g.MEMCACHED = init_memcached(host=self.config['MEMCACHED_HOST'],port=self.config['MEMCACHED_PORT'])


...

缓存/ __ init __。py

from werkzeug.contrib.cache import MemcachedCache
import gevent
import logging

def init_memcached(host,port):
    memcached_connected = False
    while not memcached_connected:
        try:
            MEMCACHED = MemcachedCache([host + ':' + str(port)])
            memcached_connected = True
        except Exception as e:
            logging.info("Memcached not connected")
            logging.error(e)
            gevent.sleep(1)
    return MEMCACHED

controllers / page.py

from flask import Blueprint, request, render_template, url_for, flash, g, redirect
from flask.views import MethodView
from flask.ext.login import current_user
from json import dumps
from app import config
...

items = Blueprint(
    'items',
    __name__,
    template_folder=config.TEMPLATES,
)

class Item(MethodView):
    def get(self,item):
        result = g.MEMCACHED.get('item')
        if result is None:
            ...
            g.MEMCACHED.set('item', result, timeout=60)
        return render_template('item.html',result=result)

items.add_url_rule("/path/<item>", view_func=Item.as_view('item'))

我假设这与在g对象中使用memcached有关。我宁愿一次将连接设置为memcached,就像在处理dbs一样,但似乎memcached不会以相同的方式响应。

0 个答案:

没有答案