安装
pip install redis
pip install flask_cache
具体
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='')
configure_logging(app)
configure_modules(app)
configure_cache(app, cache)
return app
app = create_app()
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()
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
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__':
app.run(debug=False)
问题
- 利用Flask-Cache缓存flask中带表单数据的GET请求,及FileSystemCache示例