https://github.com/jimmyyyeh/flask-api-cache
A package for caching flask api with custom key.
https://github.com/jimmyyyeh/flask-api-cache
flask python redis restful-api
Last synced: about 2 months ago
JSON representation
A package for caching flask api with custom key.
- Host: GitHub
- URL: https://github.com/jimmyyyeh/flask-api-cache
- Owner: jimmyyyeh
- Created: 2020-10-07T08:44:10.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2021-04-01T07:28:03.000Z (about 4 years ago)
- Last Synced: 2025-03-22T13:45:51.462Z (2 months ago)
- Topics: flask, python, redis, restful-api
- Language: Python
- Homepage: https://pypi.org/project/flask-api-cache/
- Size: 13.7 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# flask-api-cache
**A package for caching flask api with custom key.**## Description:
A decorator for python flask api.You can set cache in your **memory** or with **redis instance**,
the key will be generated by the following rule:
`{REQUEST_FULL_PATH}:{PARAMETER_STRING}`
or you can use your custom key function by key_func args,
the value will be your function return value.## How To Use:
### Import
```python
from flask_api_cache import ApiCache
```### Parameters
|name|required|description|
|----|--------|-----------|
|redis|no|if you want to caching data in redis, you can call ApiCache with a redis instance.|
|expired_time|no|set your expired time with **seconds**, the default value is 24 * 60 * 60 seconds (1 day)|
|key_func|no|the function which you want to make custom key|### Cache Without Redis
```python
@app.route('/example_1/')
@ApiCache(expired_time=10)
def example_1(name):
"""
caching data in memory with default key.
- http://0.0.0.0:5000/example_1/jimmy
:param name:
:return:
"""
return jsonify(f'Hi {name}, it is {datetime.now()}')
```
If you request for **http://0.0.0.0:5000/example_1/jimmy**,
it will set a 10 seconds cache by key: `example_1:/example_1/Jimmy?`,
with value: `Hi jimmy, it is 2020-10-23 16:06:27.996358.`,
in your memory, it will be cleared after api service restart.### Cache With Redis
```python
@app.route('/example_3/')
@ApiCache(redis=redis_instance, expired_time=10)
def example_3(items):
"""
caching data in redis instance with default key.
- http://0.0.0.0:5000/example_3/coffee
:param items:
:return:
"""
return jsonify(f'You bought {items} at {datetime.now()}')
```
If you request for **http://0.0.0.0:5000/example_3/coffee**,
it will set a 10 seconds cache by key: `example_3:/example_3/coffee?`,
with value: `You bought coffee at 2020-10-23 16:06:59.904216`,
in your redis instance.### Cache With Custom Function
```python
def custom_func_2(**kwargs):
items = kwargs.get('items')
price = kwargs.get('price')
keys = f'{items}:{price}'
return keys@app.route('/example_4//')
@ApiCache(redis=redis_instance, key_func=custom_func_2, expired_time=10)
def example_4(items, price):
"""
caching data in redis instance with custom function.
- http://0.0.0.0:5000/example_4/coffee/20
:param items:
:param price:
:return:
"""
return jsonify(f'You bought {items} at {datetime.now()}, it cost ${price}')```
If you request for **http://0.0.0.0:5000/example_4/coffee/20** ,
it will set a 10 seconds cache by key: `coffee:20`,
with value: `You bought coffee at 2020-10-23 16:07:59.818357, it cost $20`,
in your memory, it will be cleared after service restart.### [Sample Code](https://github.com/chienfeng0719/flask-api-cache/blob/develop/example.py)
```python
# -*- coding: utf-8 -*-
"""
┏┓ ┏┓
┏━┛┻━━━━━━━┛┻━┓
┃ ☃ ┃
┃ ┳┛ ┗┳ ┃
┃ ┻ ┃
┗━┓ ┏━┛
┗┳ ┗━┓
┃ ┣┓
┃ ┏┛
┗┓┓┏━━━━┳┓┏┛
┃┫┫ ┃┫┫
┗┻┛ ┗┻┛
God Bless,Never Bug
"""
import redis
from flask import Flask, request, jsonify
from flask_api_cache import ApiCache
from datetime import datetimeapp = Flask(__name__)
redis_instance = redis.StrictRedis(host='redis', port=6379)
def custom_func_1(**kwargs):
name = kwargs.get('name')
age = kwargs.get('age')
sex = kwargs.get('sex')
keys = f'{name}:{age}:{sex}'
return keysdef custom_func_2(**kwargs):
items = kwargs.get('items')
price = kwargs.get('price')
keys = f'{items}:{price}'
return keys"""GET"""
@app.route('/example_1/', methods=['GET'])
@ApiCache(expired_time=10)
def example_1(name):
"""
caching data in memory with default key.
- http://0.0.0.0:5000/example_1/jimmy
:param name:
:return:
"""
return jsonify(f'Hi {name}, it is {datetime.now()}')@app.route('/example_2//', methods=['GET'])
@ApiCache(expired_time=10, key_func=custom_func_1)
def example_2(name, age):
"""
caching data in memory with custom function.
- http://0.0.0.0:5000/example_2/jimmy/18?sex=boy
:param name:
:param age:
:return:
"""
sex = request.args.get('sex', 'boy', str)
return jsonify(f'{name} is a {age} years old {sex}. {datetime.now()}')@app.route('/example_3/', methods=['GET'])
@ApiCache(redis=redis_instance, expired_time=10)
def example_3(items):
"""
caching data in redis instance with default key.
- http://0.0.0.0:5000/example_3/coffee
:param items:
:return:
"""
return jsonify(f'You bought {items} at {datetime.now()}')@app.route('/example_4//', methods=['GET'])
@ApiCache(redis=redis_instance, key_func=custom_func_2, expired_time=10)
def example_4(items, price):
"""
caching data in redis instance with custom function.
- http://0.0.0.0:5000/example_4/coffee/20
:param items:
:param price:
:return:
"""
return jsonify(f'You bought {items} at {datetime.now()}, it cost ${price}')"""POST / PUT / DELETE"""
@app.route('/example_5/', methods=['POST', 'PUT', 'DELETE'])
@ApiCache(expired_time=10)
def example_5(name):
"""
caching data in memory with default key.
- http://0.0.0.0:5000/example_5/jimmy
- payload:
{
"items": "coffee",
"price": 18
}
:param name:
:return:
"""
payload = request.json
result = dict()
result['payload'] = payload
result['greeting'] = f'Hi {name}, it is {datetime.now()}'
return jsonify(result)@app.route('/example_6/', methods=['POST', 'PUT', 'DELETE'])
@ApiCache(redis=redis_instance, expired_time=10)
def example_6(name):
"""
caching data in redis instance with default key.
- http://0.0.0.0:5000/example_6/jimmy
- payload:
{
"items": "coffee",
"price": 18
}
:param name:
:return:
"""
payload = request.json
result = dict()
result['payload'] = payload
result['greeting'] = f'Hi {name}, it is {datetime.now()}'
return result@app.route('/example_7/', methods=['POST', 'PUT', 'DELETE'])
@ApiCache(redis=redis_instance, key_func=custom_func_2, expired_time=10)
def example_7(name):
"""
caching data in redis instance with custom function.
- http://0.0.0.0:5000/example_7/jimmy
- payload:
{
"items": "coffee",
"price": 18
}
:param name:
:return:
"""
payload = request.json
result = dict()
result['payload'] = payload
result['greeting'] = f'Hi {name}, it is {datetime.now()}'
return resultif __name__ == '__main__':
app.run('0.0.0.0', port=5000, debug=True)```
**Buy me a coffee, if you like it!**