Skip to main content

A tool for flask api cache with args

Project description

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:
{YOUR_FUNCTION_NAME}:{PARAMS_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

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

@app.route('/example_1/<string:name>')
@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

@app.route('/example_3/<string:items>')
@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

def custom_func_2(**kwargs):
    items = kwargs.get('items')
    price = kwargs.get('price')
    keys = f'{items}:{price}'
    return keys

@app.route('/example_4/<string:items>/<int:price>')
@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

# -*- coding: utf-8 -*-
"""
      ┏┓       ┏┓
    ┏━┛┻━━━━━━━┛┻━┓
    ┃      ☃      ┃
    ┃  ┳┛     ┗┳  ┃
    ┃      ┻      ┃
    ┗━┓         ┏━┛
      ┗┳        ┗━┓
       ┃          ┣┓
       ┃          ┏┛
       ┗┓┓┏━━━━┳┓┏┛
        ┃┫┫    ┃┫┫
        ┗┻┛    ┗┻┛
    God Bless,Never Bug
"""
import redis
from flask import Flask, request, jsonify
from flask_api_cache import ApiCache
from datetime import datetime

app = 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 keys


def custom_func_2(**kwargs):
    items = kwargs.get('items')
    price = kwargs.get('price')
    keys = f'{items}:{price}'
    return keys


"""GET"""


@app.route('/example_1/<string:name>', 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/<string:name>/<int:age>', 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/<string:items>', 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/<string:items>/<int:price>', 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/<string:name>', 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/<string:name>', 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/<string:name>', 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 result


if __name__ == '__main__':
    app.run('0.0.0.0', port=5000, debug=True)

Buy Me A Coffee

Buy me a coffee, if you like it!

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

flask-api-cache-0.1.0.tar.gz (5.8 kB view details)

Uploaded Source

Built Distribution

flask_api_cache-0.1.0-py3-none-any.whl (5.3 kB view details)

Uploaded Python 3

File details

Details for the file flask-api-cache-0.1.0.tar.gz.

File metadata

  • Download URL: flask-api-cache-0.1.0.tar.gz
  • Upload date:
  • Size: 5.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.50.0 CPython/3.8.7

File hashes

Hashes for flask-api-cache-0.1.0.tar.gz
Algorithm Hash digest
SHA256 886689800ae9df93a656c6ab44fdbe1c2135d69bb05c64ea7fb3b7bca89af1e8
MD5 79fe4f57b4dc0289c7e387515584898f
BLAKE2b-256 a4c532925b0a73ecbb5b43c226e54a405967f39768865f159951320baaa5616d

See more details on using hashes here.

File details

Details for the file flask_api_cache-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: flask_api_cache-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 5.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/3.2.0 pkginfo/1.5.0.1 requests/2.24.0 setuptools/51.1.1 requests-toolbelt/0.9.1 tqdm/4.50.0 CPython/3.8.7

File hashes

Hashes for flask_api_cache-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9254a5c9f81a09da387faeae14bb5da3ef565d03d4d6868d077389ac23d730d5
MD5 81f22b477776fb557382a53488d663a2
BLAKE2b-256 1d913115f4203aaaadbe1232b82959d20a5656a76f23ddecd539c3a061e061c0

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page