Flask下使用Redis作为缓存

安装

pip install redis
pip install flask_cache

具体

blockmeta下的__init__.py

# -*- coding: utf-8 -*-

import sys
from flask import Flask
from redis_cli_conf import redis_cli_config, cache
from blockmeta import log, urls
from tools import flags

FLAGS = flags.FLAGS
FLAGS(sys.argv)
DEFAULT_APP_NAME = 'btmscan'


def configure_modules(app):
    urls.register_api(app)


def configure_logging(app):
    log.init_log(app)


def configure_cache(app, cache):
    app.config.from_object(redis_cli_config)
    cache.init_app(app, redis_cli_config)


def create_app():
    app = Flask(DEFAULT_APP_NAME, static_folder='static', static_url_path='')
    # register log.py
    configure_logging(app)
    # register rest url
    configure_modules(app)
    # configure cache
    configure_cache(app, cache)
    return app


app = create_app()

blockmeta下的redis_cli_conf.py

from flask_cache import Cache
from flask import request
import urllib
redis_cli_config = {
    'CACHE_TYPE': 'redis',
    'CACHE_REDIS_HOST': '127.0.0.1',
    'CACHE_REDIS_PORT': 6379,
    'CACHE_REDIS_DB': '',
    'CACHE_REDIS_PASSWORD': ''
}
cache = Cache()

# 需要自定义cache_key,因为不然只把url作为key,而后面的参数(即?key1=<value1>&key2=<value2>)不会纳入key
# 详细请看下面
def cache_key():
    args = request.args
    key = request.path + '?' + urllib.urlencode([
        (k, v) for k in sorted(args) for v in sorted(args.getlist(k))
    ])
    return key

blockmeta.block下的api.py

# -*- coding: utf-8 -*-

from flask import current_app
from blockmeta.redis_cli_conf import cache, cache_key
from flask_restful import Resource, reqparse
from blockmeta.utils.bytom import remove_0x
from blockmeta.constant import DEFAULT_OFFSET
from blockmeta.utils import util
from manager import BlockManager
from tools import flags

FLAGS = flags.FLAGS


class BlockAPI(Resource):
    def __init__(self):
        self.logger = current_app.logger
        self.manager = BlockManager()

        super(BlockAPI, self).__init__()

    @cache.cached(timeout=60 * 3, key_prefix=cache_key)
    def get(self, block_id):
        block_id = remove_0x(block_id.strip().lower())

        result = self.manager.handle_block(block_id)
        if result is None:
            return util.wrap_error_response(status='failure', code='404')
        return util.wrap_response(status='success', code='200', data=result)


class BlockListAPI(Resource):
    def __init__(self):
        self.logger = current_app.logger
        self.manager = BlockManager()

        self.parser = reqparse.RequestParser()
        self.parser.add_argument('page', type=int, help='page number')

        super(BlockListAPI, self).__init__()

    @cache.cached(timeout=60 * 3, key_prefix=cache_key)
    def get(self):
        try:
            args = self.parser.parse_args()
            page = args.get('page', None) if args is not None else None
            if not isinstance(page, int) or page <= 0:
                page = 1
            start, end = DEFAULT_OFFSET * (page - 1), DEFAULT_OFFSET * page
            result = self.manager.list_blocks(start, end)
            if len(result.get('blocks', [])) == 0:
                return util.wrap_error_response(status='failure', code='404')
            result['no_page'] = 1 if not page else int(page)
            return util.wrap_response(status='success', code='200', data=result)
        except Exception, e:
            return util.wrap_error_response(status='failure', code='404')

btmscan下的runrestful.py

from blockmeta import app

if __name__ == '__main__':
    # TODO: configured by setting
    app.run(debug=False)

问题

  1. 利用Flask-Cache缓存flask中带表单数据的GET请求,及FileSystemCache示例

猜你喜欢

转载自blog.csdn.net/jason_cuijiahui/article/details/80509541
今日推荐