A caching extension for Flask

Overview

Flask-Caching

Build Status Coverage Status PyPI Version Documentation Status License Code style: black

Adds easy cache support to Flask.

This is a fork of the Flask-Cache extension.

Flask-Caching also includes the cache module from werkzeug licensed under a BSD-3 Clause License.

Setup

Flask-Caching is available on PyPI and can be installed with:

pip install flask-caching

The Cache Extension can either be initialized directly:

from flask import Flask
from flask_caching import Cache

app = Flask(__name__)
# For more configuration options, check out the documentation
cache = Cache(app, config={'CACHE_TYPE': 'simple'})

Or through the factory method:

cache = Cache(config={'CACHE_TYPE': 'simple'})

app = Flask(__name__)
cache.init_app(app)

Compatibility with Flask-Cache

There are no known incompatibilities or breaking changes between the latest Flask-Cache release (version 0.13, April 2014) and the current version of Flask-Caching. Due to the change to the Flask-Caching name and the extension import transition, Python import lines like:

from flask.ext.cache import Cache

will need to be changed to:

from flask_caching import Cache

Python versions

Starting with version 1.8, Flask-Caching dropped Python 2 support. The library is tested against Python 3.5, 3.6, and PyPy 3.5.

Links

Comments
  • add request body based caching

    add request body based caching

    This PR is a stab at #71, caching based on request body.

    I implemented it because it seemed like a fairly easy thing to do and I was looking for an excuse to dig through this projects source a little bit to get a better understanding, but I would like to raise the point that this functionality is very dangerous.

    The POST method is used to submit an entity to the specified resource, often causing a change in state or side effects on the server.

    The difference between PUT and POST is that PUT is idempotent: calling it once or several times successively has the same effect (that is no side effect), where successive identical POST may have additional effects, like passing an order several times.

    POST requests are typically for operations like resource creation on the server, and I worry that implementing this feature will lead some users astray, either by caching routes and thus essentially dropping requests since they never go through the server logic, or misinforming less experienced users into flawed usage of POST requests.

    What do you think @sh4nks?

    resolves #71

    opened by buckley-w-david 18
  • Concurrency problem

    Concurrency problem

    https://github.com/sh4nks/flask-caching/blob/50bc8af30ae9f85714a119c323e8f09100d7a937/flask_caching/init.py#L385-L392

    If the cache has expired, after the execution of the code "rv = self.cache.get(cache_key)", there may be other processes that have already written values, but here will return a None instead of calling the function to get the new return value. Sorry for the bad English, all of the above are google translation.

    opened by mt3925 15
  • WIP: Redis sentinel support

    WIP: Redis sentinel support

    Documented solution for #40

    This is basically the original commit of @sh4nks (rebased onto the current master) with some documentation added. It still needs some testing and possibly some additions, but it seems to be a good start.

    opened by gergelypolonkai 11
  • add a `make_cache_key` parameter

    add a `make_cache_key` parameter

    This PR is essentially a more considered version of #76

    After the additional discussion with @bzed I changed my stance on the functionality, but actually even further it seemed like what the library actually needed was a way to allow the consumer complete control over the cache key generation if they so wished.

    I have added a make_cache_key parameter to the cached decorator for this purpose.

    This should allow for use cases such as #71, an example of which is in the test added in this PR

    opened by buckley-w-david 9
  • Add Google Cloud Storage Cache

    Add Google Cloud Storage Cache

    This is useful in cloud environments where shared disk cache doesn't exist, but the computation takes a lot of resources and the resulted data doesn't fit easily in Memcached or Redis.

    I used an abandoned S3 pull request as a starting point. https://github.com/pallets/cachelib/pull/6

    opened by oittaa 8
  • Control caching based on response

    Control caching based on response

    I might be missing entierly the intent of the developers, and possibly there is a much better solution to my problem (#91). This is just what I implemented which is sufficient for my needs, I wonder if it makes any sense.

    opened by volodymyrss 8
  • delete_many stop at first error

    delete_many stop at first error

        def delete_many(self, *keys):
            """Deletes multiple keys at once.
    
            :param keys: The function accepts multiple keys as positional
                         arguments.
            :returns: Whether all given keys have been deleted.
            :rtype: boolean
            """
            return all(self.delete(key) for key in keys)
    

    Currently the delete loop stops at the first item that is False (it's the behavior of the all function if evaluation is done inside) This is annoying because you have to check the presence in the cache of all the keys you want to delete. The default behaviour should be to continue the deletion despite the errors. In this way the trick is to bypass the evaluation during the loop:

     return all([self.delete(key) for key in keys])
    

    Or add this as option ?

    def delete_many(self, *keys, ignore_errors=False)
    

    Note: I found this problem with the file system cache

    bug 
    opened by johaven 8
  • TypeError: sequence item 0: expected str instance bytes found

    TypeError: sequence item 0: expected str instance bytes found

    Exception possibly due to cache backend.
    Traceback (most recent call last):
      File "https://github.com/sh4nks/flask-caching/blob/master/flask_caching/__init__.py"
        rv = self.cache.get(cache_key)
      File "https://github.com/sh4nks/flask-caching/blob/master/flask_caching/backends/clients.py"
        return self._get(key)
        serialized = ''.join([v for v in result if v is not None]
    TypeError: sequence item 0: expected str instance, bytes found
    

    Python 3.6.0 Flask-Cache==0.13.1

    needs info 
    opened by reubano 8
  • pylibmc is not thread-safe

    pylibmc is not thread-safe

    The way pylibmc client is used is not thread-safe. I think flask-caching should use the ThreadMappedPool. Otherwise on threaded Flask application, we must use python-memcached but there is no way to force to use this library.

    question 
    opened by cedk 7
  • _pickle.UnpicklingError: invalid load key, '9'

    _pickle.UnpicklingError: invalid load key, '9'

    using blueprints, FileSystemCache on Google App Engine Standard Python3.7 and having the cache separate:

    cache.py:

    from flask_caching import Cache
    cache = Cache()
    

    config:

    CACHE_CONFIG = {
        'CACHE_TYPE': 'filesystem',
        'CACHE_DIR': '/tmp',
        'CACHE_THRESHOLD': 1000,
        'CACHE_DEFAULT_TIMEOUT': 3600,
    }
    

    app.py:

    app = Flask(__name__)
    cache.init_app(app, config.CACHE_CONFIG)
    app.config.from_object(flask_config)
    

    blueprint:

    from cache import cache 
    
    @public.route('/<lang>/', methods=['GET'])
    @cache.cached()
    def page(lang):
        ...
    

    Then getting this error:

    ERROR:root:Traceback (most recent call last):
      File "/tmp/tmphwgdsy/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
        rv = self.dispatch_request()
      File "/tmp/tmphwgdsy/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
        return self.view_functions[rule.endpoint](**req.view_args)
      File "/tmp/tmphwgdsy/lib/python3.6/site-packages/flask_caching/__init__.py", line 400, in decorated_function
        timeout=decorated_function.cache_timeout,
      File "/tmp/tmphwgdsy/lib/python3.6/site-packages/flask_caching/backends/filesystem.py", line 160, in set
        self._prune()
      File "/tmp/tmphwgdsy/lib/python3.6/site-packages/flask_caching/backends/filesystem.py", line 109, in _prune
        expires = pickle.load(f)
    _pickle.UnpicklingError: invalid load key, '9'.
    
    opened by fili 7
  • Function having only *args and *kwargs fails

    Function having only *args and *kwargs fails

    In the context of my plugin flask-capitains-nemo ( https://github.com/Capitains/flask-capitains-nemo ), I am trying to get memoized a certain list of functions. I currently cache dynamically these one through :

            if self.cache is not None:
                for func, instance in self.cached:
                    setattr(instance, func.__name__, self.cache.memoize()(func))
    

    It works well, as long as I don't cache functions that have no enforced args or kwargs schemes but are actually route dispatcher :

    def render(self, template, **kwargs):
    

    will always create the key : flask_nemo.Nemo.render('main::collection.html',){} as the output of self._memoize_kwargs_to_args will not work with a **kwargs system. It is most likely the result of the use of get_arg_names. which will find only one defined arg.

    I'll be trying to propose a fix for this issue.

    opened by PonteIneptique 7
  • Bump sphinx from 5.3.0 to 6.0.0 in /requirements

    Bump sphinx from 5.3.0 to 6.0.0 in /requirements

    Bumps sphinx from 5.3.0 to 6.0.0.

    Release notes

    Sourced from sphinx's releases.

    v6.0.0

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.0.0b2

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    v6.0.0b1

    Changelog: https://www.sphinx-doc.org/en/master/changes.html

    Changelog

    Sourced from sphinx's changelog.

    Release 6.0.0 (released Dec 29, 2022)

    Dependencies

    • #10468: Drop Python 3.6 support
    • #10470: Drop Python 3.7, Docutils 0.14, Docutils 0.15, Docutils 0.16, and Docutils 0.17 support. Patch by Adam Turner

    Incompatible changes

    • #7405: Removed the jQuery and underscore.js JavaScript frameworks.

      These frameworks are no longer be automatically injected into themes from Sphinx 6.0. If you develop a theme or extension that uses the jQuery, $, or $u global objects, you need to update your JavaScript to modern standards, or use the mitigation below.

      The first option is to use the sphinxcontrib.jquery_ extension, which has been developed by the Sphinx team and contributors. To use this, add sphinxcontrib.jquery to the extensions list in conf.py, or call app.setup_extension("sphinxcontrib.jquery") if you develop a Sphinx theme or extension.

      The second option is to manually ensure that the frameworks are present. To re-add jQuery and underscore.js, you will need to copy jquery.js and underscore.js from the Sphinx repository_ to your static directory, and add the following to your layout.html:

      .. code-block:: html+jinja

      {%- block scripts %} {{ super() }} {%- endblock %}

      .. _sphinxcontrib.jquery: https://github.com/sphinx-contrib/jquery/

      Patch by Adam Turner.

    • #10471, #10565: Removed deprecated APIs scheduled for removal in Sphinx 6.0. See :ref:dev-deprecated-apis for details. Patch by Adam Turner.

    • #10901: C Domain: Remove support for parsing pre-v3 style type directives and roles. Also remove associated configuration variables c_allow_pre_v3 and c_warn_on_allowed_pre_v3. Patch by Adam Turner.

    Features added

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump pytest-asyncio from 0.20.2 to 0.20.3 in /requirements

    Bump pytest-asyncio from 0.20.2 to 0.20.3 in /requirements

    Bumps pytest-asyncio from 0.20.2 to 0.20.3.

    Release notes

    Sourced from pytest-asyncio's releases.

    pytest-asyncio 0.20.3


    title: 'pytest-asyncio'

    image

    image

    image

    Supported Python versions

    image

    pytest-asyncio is a pytest plugin. It facilitates testing of code that uses the asyncio library.

    Specifically, pytest-asyncio provides support for coroutines as test functions. This allows users to await code inside their tests. For example, the following code is executed as a test item by pytest:

    @pytest.mark.asyncio
    async def test_some_asyncio_code():
        res = await library.do_something()
        assert b"expected result" == res
    

    Note that test classes subclassing the standard unittest library are not supported. Users are advised to use unittest.IsolatedAsyncioTestCase or an async framework such as asynctest.

    pytest-asyncio is available under the Apache License 2.0.

    Installation

    To install pytest-asyncio, simply:

    $ pip install pytest-asyncio
    

    ... (truncated)

    Changelog

    Sourced from pytest-asyncio's changelog.

    0.20.3 (22-12-08)

    • Prevent DeprecationWarning to bubble up on CPython 3.10.9 and 3.11.1. [#460](https://github.com/pytest-dev/pytest-asyncio/issues/460) <https://github.com/pytest-dev/pytest-asyncio/issues/460>_
    Commits
    • 007e8ec [fix] Prevent DeprecationWarning about existing event loops to bubble up into...
    • 44ca3da Build(deps): Bump zipp from 3.10.0 to 3.11.0 in /dependencies/default (#455)
    • c3c601c Build(deps): Bump pypa/gh-action-pypi-publish from 1.5.1 to 1.5.2 (#456)
    • a962e2b Build(deps): Bump importlib-metadata in /dependencies/default (#454)
    • 56a393a Simplify README, move most content to a separate user documentation. (#448)
    • 3c78732 Build(deps): Bump hypothesis in /dependencies/default (#453)
    • d6a9a72 Build(deps): Bump exceptiongroup in /dependencies/default (#451)
    • 42da7a0 Build(deps): Bump hypothesis in /dependencies/default (#450)
    • 0b281b1 Build(deps): Bump mypy from 0.990 to 0.991 in /dependencies/default (#446)
    • d39589c Update pre-commit hooks (#449)
    • See full diff in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump tox from 3.27.1 to 3.28.0 in /requirements

    Bump tox from 3.27.1 to 3.28.0 in /requirements

    Bumps tox from 3.27.1 to 3.28.0.

    Release notes

    Sourced from tox's releases.

    3.28.0

    What's Changed

    Full Changelog: https://github.com/tox-dev/tox/compare/3.27.1...3.28.0

    Changelog

    Sourced from tox's changelog.

    v3.28.0 (2022-12-14)

    Features ^^^^^^^^

    • Support provision of tox 4 with the min_version option - by :user:hroncok [#2661](https://github.com/tox-dev/tox/issues/2661) <https://github.com/tox-dev/tox/issues/2661>_
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump pallets-sphinx-themes from 2.0.2 to 2.0.3 in /requirements

    Bump pallets-sphinx-themes from 2.0.2 to 2.0.3 in /requirements

    Bumps pallets-sphinx-themes from 2.0.2 to 2.0.3.

    Changelog

    Sourced from pallets-sphinx-themes's changelog.

    Version 2.0.3

    Released 2022-12-24

    • Fix compatibility with packaging>=22.
    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump types-redis from 4.3.21.6 to 4.3.21.7 in /requirements

    Bump types-redis from 4.3.21.6 to 4.3.21.7 in /requirements

    Bumps types-redis from 4.3.21.6 to 4.3.21.7.

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
  • Bump pre-commit from 2.20.0 to 2.21.0 in /requirements

    Bump pre-commit from 2.20.0 to 2.21.0 in /requirements

    Bumps pre-commit from 2.20.0 to 2.21.0.

    Release notes

    Sourced from pre-commit's releases.

    pre-commit v2.21.0

    Features

    Fixes

    Changelog

    Sourced from pre-commit's changelog.

    2.21.0 - 2022-12-25

    Features

    Fixes

    Commits
    • 40c5bda v2.21.0
    • bb27ea3 Merge pull request #2642 from rkm/fix/dotnet-nuget-config
    • c38e0c7 dotnet: ignore nuget source during tool install
    • bce513f Merge pull request #2641 from rkm/fix/dotnet-tool-prefix
    • e904628 fix dotnet hooks with prefixes
    • d7b8b12 Merge pull request #2646 from pre-commit/pre-commit-ci-update-config
    • 94b6178 [pre-commit.ci] pre-commit autoupdate
    • b474a83 Merge pull request #2643 from pre-commit/pre-commit-ci-update-config
    • a179808 [pre-commit.ci] pre-commit autoupdate
    • 3aa6206 Merge pull request #2605 from lorenzwalthert/r/fix-exe
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    dependencies 
    opened by dependabot[bot] 0
Releases(v2.0.1)
  • v2.0.1(Jul 30, 2022)

  • v2.0.0(Jun 26, 2022)

  • v1.11.1(May 28, 2022)

  • v1.10.1(Mar 17, 2021)

    Released on March 17th 2021

    • A GoogleCloudStorageCache backend has been added to the user contributed caching backends. PR #214.
    • Fix a regression introduced in the last release which broke all applications subclassing the Cache class.
    • Add test_generic_get_bytes test case. PR #236.
    • Various improvements and fixes.
    Source code(tar.gz)
    Source code(zip)
  • v1.10.0(Mar 4, 2021)

    Released on March 4th 2021

    DEPRECATION NOTICE

    • uwsgicache is not officially maintained anymore and deprecated.

    • Caching backends are now loaded using the full path to the caching backend class. For officially supported caching backends it is sufficient to just specify the name of the backend class. See the documentation for a full list of caching backends: https://flask-caching.readthedocs.io/en/latest/#configuring-flask-caching

      In the next major release (2.0), this will be the only supported way.

    Added

    • Important: The way caching backends are loaded have been refactored. Instead of passing the name of the initialization function one can now use the full path to the caching backend class. For example: CACHE_TYPE="flask_caching.contrib.UWSGICache". In the next major release (2.0), this will be the only supported way.
      Thanks to @gergelypolonkai for doing the heavy lifting here!
    • Add Type Annotations. PR #198.
    • Add some basic logging to SimpleCache and FileSystemCache for better observability. PR #203.
    • Add option in memoize to ignore args via args_to_ignore. PR #201.
    • Add a Redis Cluster Mode (RedisClusterCache) caching backend. PR #173.

    Changed

    • Switch from Travis-CI to GitHub Actions
    • Do not let PIP install this package on unsupported Python Versions. PR #179.
    • Stop marking wheels as Python 2 compatible. PR #196.

    Fixed

    • Fix add() in RedisCache without a timeout. PR #218.
    • Fix error in how the FileSystemCache counts the number of files. PR #210.
    • Fix default_timeout not being properly passed to its super constructor. PR #187.
    • Fix kwargs not being passed on in function _memoize_make_cache_key. PR #184.
    • Fix uWSGI initialization by checking if uWSGI has the cache2 option enabled. PR #176.
    • Documentation updates and fixes.
    Source code(tar.gz)
    Source code(zip)
  • v1.9.0(Jun 2, 2020)

    Released on June 2nd 2020

    • Added an option to include the functions source code when generating the cache key. PR #156.
    • Added a new feature that allows one to completely control the way how cache keys are generated. For example, one can now implement a function that generates cache the keys based on the POST-based requests. PR #159.
    • Fixed a few cache backend naming collisions by renaming them from simple to simplecache, null to nullcache and filesystem to filesystemcache.
    • Explicitly pass the default_timeout to RedisCache from RedisSentinelCache.
    • Use os.replace instead of werkzeug's rename due to Windows raising an OSError if the dst file already exist.
    • Documentation updates and fixes.
    Source code(tar.gz)
    Source code(zip)
  • v1.8.0(Nov 25, 2019)

    Released on November 24th 2019

    Breaking: Dropped support for Python 2

    • Add option to specify if None is a cached value or not. See PR #140 and #141.
    • Allow to use __caching_id__ rather than __repr__ as an object caching key. PR #123.
    • The RedisCache backend now support generating the key_prefix via a callable. PR #109.
    • Emit a warning if the CACHE_TYPE is set to filesystem but no CACHE_DIR is set.
    • Fixes Google App Engine Memcache backend. See issue #120 for more details.
    • Various documentation updates and fixes.
    Source code(tar.gz)
    Source code(zip)
  • v1.7.2(May 30, 2019)

    Released on May 28th 2019

    This is the last version supporting Python 2!

    • Do not run a cached/memoized function if the cached return value is None. PR #108.
    Source code(tar.gz)
    Source code(zip)
  • v1.7.1(Apr 16, 2019)

    Released on April 16th 2019

    This is the last version supporting Python 2!

    • Fix introspecting Python 3 functions by using varkw. PR #101.
    • Remove leftover files (uwsgi.py) in PyPI package. See issue #102 for more details.
    Source code(tar.gz)
    Source code(zip)
  • v1.7.0(Mar 29, 2019)

    Released on March 29th 2019

    This is the last version supporting Python 2!

    • Added a feature called response_filter which enables one to only cache views depending on the response code. PR #99.
    • A DeprecationWarning got turned into a TypeError.
    Source code(tar.gz)
    Source code(zip)
  • v1.6.0(Mar 6, 2019)

    Released on March 6th 2019

    • The delete_many function is now able to ignore any errors and continue deleting the cache. However, in order to preserve backwards compatibility, the default mode is to abort the deletion process. In order to use the new deletion mode, one has to flip the config setting CACHE_IGNORE_ERRORS to True. This was and still is only relevant for the filesystem and simple cache backends. PR #94.
    • Re-added the gaememcached CACHE_TYPE for improved backwards compatibility.
    • Documentation improvements. PR #96
    Source code(tar.gz)
    Source code(zip)
  • v1.5.0(Feb 23, 2019)

    Released on February 23rd 2019

    Changes

    • Add support for a Redis Sentinel Cluster. PR #90.
    • Parameterize the hash function so alternatives can be used. PR #77.
    • Include the deprecated werkzeug.contrib.cache module in Flask-Caching. PR #75.
    Source code(tar.gz)
    Source code(zip)
  • v1.4.0(Sep 16, 2018)

    Released on April 16th 2018

    Changes

    • Fix logic for creating key for var args in memoize. PR #70.
    • Allow older Werkzeug versions by making the UWSGICache backend conditional. PR #55.
    • Some documentation improvements. PR #48, #51, #56 and #67.
    • Some CI improvements. PR #49 and #50.
    Source code(tar.gz)
    Source code(zip)
  • v1.3.3(Oct 5, 2017)

  • v1.3.2(Jun 25, 2017)

    Released on June 25th 2017

    Changes

    • Fix spreadsaslmemcached backend when using Python 3.
    • Fix kwargs order when memoizing a function using Python 3.6 or greater. See #27.
    Source code(tar.gz)
    Source code(zip)
  • v1.3.1(Jun 25, 2017)

    Released on June 20th 2017

    • Avoid breakage for environments with Werkzeug<0.12 installed because the uwsgi backend depends on Werkzeug >=0.12
    Source code(tar.gz)
    Source code(zip)
  • v1.3.0(Jun 18, 2017)

    Released on June 17th 2017

    • Add uWSGI Caching backend (requires Werkzeug >= 0.12)
    • Provide a keyword query_string to the cached decorator in order to create the same cache key for different query string requests, so long as they have the same key/value (order does not matter). PR #35.
    • Use pytest as test suite and test runner. Additionally, the tests have been split up into multiple files instead of having one big file.
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Jul 4, 2016)

    First release since 2013.

    • Changed the way of importing Flask-Cache. Instead of using the depreacted method for importing Flask Extensions (via flask.ext.cache), the name of the extension, flask_cache is used. Have a look at Flask's documentation for more information regarding this matter. This also fixes the deprecation warning from Flask.
    • Lots of PEP8 and Documentation fixes.
    • Renamed this fork Flask-Caching (flask_caching) as it will now be available on PyPI for download.

    In addition to the above mentioned fixes, following pull requests have been merged into this fork of Flask-Cache:

    Source code(tar.gz)
    Source code(zip)
A fairly common feature in web applications to have links that open a popover when hovered

Add Popovers to Links in Flask App It is a fairly common feature in web applications to have links that open a popover when hovered. Twitter does this

Gitau Harrison 1 Jan 22, 2022
Flask Apps - Open-Source And Paid | AppSeed

Flask Apps Open-Source web apps built with automation tools, HTML parsing and boilerplated code in Flask - - Provided by AppSeed App Generator. What i

App Generator 120 Oct 04, 2022
Full Stack Web Development with Flask.

Discover Flask Full Stack Web Development with Flask. http://discoverflask.com Flask is a micro web framework powered by Python. Its API is fairly sma

Real Python 4.4k Jan 06, 2023
Analytics snippets generator extension for the Flask framework.

Flask-Analytics Flask Analytics is an extension for Flask which generates analytics snippets for inclusion in templates. Installation $ pip install Fl

Mihir 80 Nov 30, 2022
This is a repository for a playlist of videos where I teach building RESTful API with Flask and Flask extensions.

Build And Deploy A REST API with Flask This is code for a series of videos in which we look at the various concepts involved when building a REST API

Ssali Jonathan 10 Nov 24, 2022
Open-source Flask Sample built on top of flask-dance library

Open-source Flask Sample built on top of flask-dance library. The project implements the social login for Github and Twitter - Originally coded by TestDriven.IO.

App Generator 4 Jul 26, 2022
retorna informações de pessoas que não existem

random-person-api API que entrega dados aleatórios sobre pessoas que (provavelmente) não existem. Como usar? Copie o link abaixo https://random-person

Miguel 3 Aug 09, 2022
Rubik's cube assistant on Flask webapp

webcube Rubik's cube assistant on Flask webapp. This webapp accepts the six faces of your cube and gives you the voice instructions as a response. Req

Yash Indane 56 Nov 22, 2022
Adds Injector support to Flask.

Flask-Injector Adds Injector support to Flask, this way there's no need to use global Flask objects, which makes testing simpler. Injector is a depend

Alec Thomas 246 Dec 28, 2022
Flask Project Template A full feature Flask project template.

Flask Project Template A full feature Flask project template. See also Python-Project-Template for a lean, low dependency Python app. HOW TO USE THIS

Bruno Rocha 96 Dec 23, 2022
Python Flask API service, backed by DynamoDB, running on AWS Lambda using the traditional Serverless Framework.

Serverless Framework Python Flask API service backed by DynamoDB on AWS Python Flask API service, backed by DynamoDB, running on AWS Lambda using the

Andreu Jové 0 Apr 17, 2022
A basic CRUD application built in flask using postgres as database

flask-postgres-CRUD A basic CRUD application built in flask using postgres as database Taks list Dockerfile Initial docker-compose - It is working Dat

Pablo Emídio S.S 9 Sep 25, 2022
This is a simple web application using Python Flask and MySQL database.

Simple Web Application This is a simple web application using Python Flask and MySQL database. This is used in the demonstration of development of Ans

Alaaddin Tarhan 1 Nov 16, 2021
HTTP security headers for Flask

Talisman: HTTP security headers for Flask Talisman is a small Flask extension that handles setting HTTP headers that can help protect against a few co

Google Cloud Platform 853 Dec 19, 2022
Source code for backpainfree.org - a Q&A platform similar to StackOverFlow

Source code for backpainfree.org - a Q&A platform similar to StackOverFlow, which is designed specifically for people with back pain problems. Users can ask questions, post answers and comments, vote

Olzhas Arystanov 8 Dec 11, 2022
An flask app for fake image detector

fake_img_detector This is a ml based project: frameworks used:- Flask Google collab #Description: Here you can Upload two different looking image with

shivam kumar 7 Jun 29, 2022
Basic flask system for login, api, and status system

Flask Multi Site With Login This is a basic website login system with an uncomplete api system NOTICE : This is NOT complete and is made to be a bare

MrShoe 0 Feb 02, 2022
SqlAlchemy Flask-Restful Swagger Json:API OpenAPI

SAFRS: Python OpenAPI & JSON:API Framework Overview Installation JSON:API Interface Resource Objects Relationships Methods Custom Methods Class Method

Thomas Pollet 365 Jan 06, 2023
Flask RESTful Web services using API to communicate between client and server.

Welcome! Open up two terminals, one for client and for server each Terminal 1 Terminal 2 Now navigate to the CW2_code directory in both like so $ cd C

Sehra Elahi 1 Nov 23, 2021
MongoEngine flask extension with WTF model forms support

Flask-MongoEngine Info: MongoEngine for Flask web applications. Repository: https://github.com/MongoEngine/flask-mongoengine About Flask-MongoEngine i

MongoEngine 815 Jan 03, 2023