将Memcached与Flask蓝图结合使用

将Memcached与Flask蓝图结合使用,flask,docker-compose,memcached,Flask,Docker Compose,Memcached,在应用程序上下文中,我似乎无法在memcached中设置对象。日志表明我连接到memcached,但当我尝试设置对象时,set函数返回“0”或False。在应用程序上下文之外,我可以连接到服务器IP和端口,并轻松获取和设置对象。以下是我的设置: 应用程序/\uuuu初始化.py class App(Flask): def __init__(self): super(App, self).__init__(__name__) self.config.from_object('ap

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

应用程序/\uuuu初始化.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'])


...
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
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'))
cache/\uuuu init\uuuuu.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'])


...
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
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'))
控制器/page.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'])


...
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
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'))
从flask导入蓝图、请求、呈现模板、url、flash、g、重定向
从flask.views导入方法视图
从flask.ext.login导入当前用户
从json导入转储
从应用程序导入配置
...
项目=蓝图(
“项目”,
__姓名,
template\u folder=config.TEMPLATES,
)
类项(方法视图):
def get(自身,项目):
result=g.MEMCACHED.get('item')
如果结果为无:
...
g、 MEMCACHED.set('item',result,timeout=60)
返回呈现模板('item.html',result=result)
items.add\u url\u规则(“/path/”,view\u func=Item.as\u view('Item'))

我假设这与在
g
对象中使用memcached有关。我更喜欢将连接设置为memcached一次,就像我对dbs所做的那样,但是memcached似乎没有以相同的方式响应

每个请求都会推送新的应用程序上下文
g
对象是全局对象,但不是在请求之间。知道了。除了将实现转移到Flask缓存之外,您对我可以做些什么来让它工作有什么建议吗?Flask缓存没有维护。尝试它有足够的文档。@Yu是的,
g
是一个每个请求的对象,当@datasci调用
self.before\u request(self.init\u dbs)
时,memcached客户端也会添加到每个请求之前。虽然我不知道为什么它不起作用,但我不会为每个请求创建一个新的客户端,而是使用一个全局客户端。另一方面:我还建议使用
Flask缓存
,因为它提供了许多方便的功能,如缓存装饰器和Jinja片段缓存。Docker中的主机设置存在问题。现在可以了。仍将探索烧瓶缓存。