Select Git revision
cache_extension.py
-
Jaemin Shin authored
- /jinja-main/.devcontainer/devcontainer.json - /jinja-main/.devcontainer/on-create-command.sh - /jinja-main/.editorconfig - /jinja-main/.github/ISSUE_TEMPLATE/bug-report.md - /jinja-main/.github/ISSUE_TEMPLATE/config.yml - /jinja-main/.github/ISSUE_TEMPLATE/feature-request.md - /jinja-main/.github/pull_request_template.md - /jinja-main/.github/workflows/lock.yaml - /jinja-main/.github/workflows/pre-commit.yaml - /jinja-main/.github/workflows/publish.yaml - /jinja-main/.github/workflows/tests.yaml - /jinja-main/.gitignore - /jinja-main/.pre-commit-config.yaml - /jinja-main/.readthedocs.yaml - /jinja-main/CHANGES.rst - /jinja-main/CONTRIBUTING.rst - /jinja-main/LICENSE.txt - /jinja-main/README.md - /jinja-main/artwork/jinjalogo.svg - /jinja-main/docs/Makefile - /jinja-main/docs/_static/jinja-logo-sidebar.png - /jinja-main/docs/_static/jinja-logo.png - /jinja-main/docs/api.rst - /jinja-main/docs/changes.rst - /jinja-main/docs/conf.py - /jinja-main/docs/examples/cache_extension.py - /jinja-main/docs/examples/inline_gettext_extension.py - /jinja-main/docs/extensions.rst - /jinja-main/docs/faq.rst - /jinja-main/docs/index.rst - /jinja-main/docs/integration.rst - /jinja-main/docs/intro.rst - /jinja-main/docs/license.rst - /jinja-main/docs/make.bat - /jinja-main/docs/nativetypes.rst - /jinja-main/docs/sandbox.rst - /jinja-main/docs/switching.rst - /jinja-main/docs/templates.rst - /jinja-main/docs/tricks.rst - /jinja-main/examples/basic/cycle.py - /jinja-main/examples/basic/debugger.py - /jinja-main/examples/basic/inheritance.py - /jinja-main/examples/basic/templates/broken.html - /jinja-main/examples/basic/templates/subbroken.html - /jinja-main/examples/basic/test.py - /jinja-main/examples/basic/test_filter_and_linestatements.py - /jinja-main/examples/basic/test_loop_filter.py - /jinja-main/examples/basic/translate.py - /jinja-main/pyproject.toml - /jinja-main/requirements/build.in - /jinja-main/requirements/build.txt - /jinja-main/requirements/dev.in - /jinja-main/requirements/dev.txt - /jinja-main/requirements/docs.in - /jinja-main/requirements/docs.txt - /jinja-main/requirements/tests.in - /jinja-main/requirements/tests.txt - /jinja-main/requirements/typing.in - /jinja-main/requirements/typing.txt - /jinja-main/scripts/generate_identifier_pattern.py - /jinja-main/src/jinja2/__init__.py - /jinja-main/src/jinja2/_identifier.py - /jinja-main/src/jinja2/async_utils.py - /jinja-main/src/jinja2/bccache.py - /jinja-main/src/jinja2/compiler.py - /jinja-main/src/jinja2/constants.py - /jinja-main/src/jinja2/debug.py - /jinja-main/src/jinja2/defaults.py - /jinja-main/src/jinja2/environment.py - /jinja-main/src/jinja2/exceptions.py - /jinja-main/src/jinja2/ext.py - /jinja-main/src/jinja2/filters.py - /jinja-main/src/jinja2/idtracking.py - /jinja-main/src/jinja2/lexer.py - /jinja-main/src/jinja2/loaders.py - /jinja-main/src/jinja2/meta.py - /jinja-main/src/jinja2/nativetypes.py - /jinja-main/src/jinja2/nodes.py - /jinja-main/src/jinja2/optimizer.py - /jinja-main/src/jinja2/parser.py - /jinja-main/src/jinja2/py.typed - /jinja-main/src/jinja2/runtime.py - /jinja-main/src/jinja2/sandbox.py - /jinja-main/src/jinja2/tests.py - /jinja-main/src/jinja2/utils.py - /jinja-main/src/jinja2/visitor.py - /jinja-main/tests/conftest.py - /jinja-main/tests/res/__init__.py - /jinja-main/tests/res/package.zip - /jinja-main/tests/res/templates/broken.html - /jinja-main/tests/res/templates/foo/test.html - /jinja-main/tests/res/templates/mojibake.txt - /jinja-main/tests/res/templates/syntaxerror.html - /jinja-main/tests/res/templates/test.html - /jinja-main/tests/res/templates2/foo - /jinja-main/tests/test_api.py - /jinja-main/tests/test_async.py - /jinja-main/tests/test_async_filters.py - /jinja-main/tests/test_bytecode_cache.py - /jinja-main/tests/test_compile.py - /jinja-main/tests/test_core_tags.py - /jinja-main/tests/test_debug.py - /jinja-main/tests/test_ext.py - /jinja-main/tests/test_filters.py - /jinja-main/tests/test_idtracking.py - /jinja-main/tests/test_imports.py - /jinja-main/tests/test_inheritance.py - /jinja-main/tests/test_lexnparse.py - /jinja-main/tests/test_loader.py - /jinja-main/tests/test_nativetypes.py - /jinja-main/tests/test_nodes.py - /jinja-main/tests/test_pickle.py - /jinja-main/tests/test_regression.py - /jinja-main/tests/test_runtime.py - /jinja-main/tests/test_security.py - /jinja-main/tests/test_tests.py - /jinja-main/tests/test_utils.py - /jinja-main/tox.ini - /jinja-kr/.devcontainer/devcontainer.json - /jinja-kr/.devcontainer/on-create-command.sh - /jinja-kr/.github/ISSUE_TEMPLATE/feature-request.md - /jinja-kr/.github/ISSUE_TEMPLATE/bug-report.md - /jinja-kr/.github/ISSUE_TEMPLATE/config.yml - /jinja-kr/.github/workflows/tests.yaml - /jinja-kr/.github/workflows/lock.yaml - /jinja-kr/.github/workflows/pre-commit.yaml - /jinja-kr/.github/workflows/publish.yaml - /jinja-kr/.github/pull_request_template.md - /jinja-kr/artwork/jinjalogo.svg - /jinja-kr/docs/_static/jinja-logo-sidebar.png - /jinja-kr/docs/_static/jinja-logo.png - /jinja-kr/docs/examples/cache_extension.py - /jinja-kr/docs/examples/inline_gettext_extension.py - /jinja-kr/docs/Makefile - /jinja-kr/docs/changes.rst - /jinja-kr/docs/license.rst - /jinja-kr/docs/make.bat - /jinja-kr/docs/integration.rst - /jinja-kr/docs/index.rst - /jinja-kr/docs/api.rst - /jinja-kr/docs/sandbox.rst - /jinja-kr/docs/intro.rst - /jinja-kr/docs/tricks.rst - /jinja-kr/docs/conf.py - /jinja-kr/docs/nativetypes.rst - /jinja-kr/docs/templates.rst - /jinja-kr/docs/extensions.rst - /jinja-kr/docs/faq.rst - /jinja-kr/docs/switching.rst - /jinja-kr/examples/basic/templates/subbroken.html - /jinja-kr/examples/basic/templates/broken.html - /jinja-kr/examples/basic/cycle.py - /jinja-kr/examples/basic/debugger.py - /jinja-kr/examples/basic/test_loop_filter.py - /jinja-kr/examples/basic/translate.py - /jinja-kr/examples/basic/inheritance.py - /jinja-kr/examples/basic/test.py - /jinja-kr/examples/basic/test_filter_and_linestatements.py - /jinja-kr/requirements/typing.in - /jinja-kr/requirements/tests.txt - /jinja-kr/requirements/docs.in - /jinja-kr/requirements/docs.txt - /jinja-kr/requirements/tests.in - /jinja-kr/requirements/build.in - /jinja-kr/requirements/build.txt - /jinja-kr/requirements/dev.in - /jinja-kr/requirements/dev.txt - /jinja-kr/requirements/typing.txt - /jinja-kr/scripts/generate_identifier_pattern.py - /jinja-kr/src/jinja2/utils.py - /jinja-kr/src/jinja2/visitor.py - /jinja-kr/src/jinja2/runtime.py - /jinja-kr/src/jinja2/sandbox.py - /jinja-kr/src/jinja2/tests.py - /jinja-kr/src/jinja2/constants.py - /jinja-kr/src/jinja2/filters.py - /jinja-kr/src/jinja2/idtracking.py - /jinja-kr/src/jinja2/lexer.py - /jinja-kr/src/jinja2/loaders.py - /jinja-kr/src/jinja2/meta.py - /jinja-kr/src/jinja2/nativetypes.py - /jinja-kr/src/jinja2/nodes.py - /jinja-kr/src/jinja2/bccache.py - /jinja-kr/src/jinja2/compiler.py - /jinja-kr/src/jinja2/debug.py - /jinja-kr/src/jinja2/defaults.py - /jinja-kr/src/jinja2/environment.py - /jinja-kr/src/jinja2/__init__.py - /jinja-kr/src/jinja2/_identifier.py - /jinja-kr/src/jinja2/async_utils.py - /jinja-kr/src/jinja2/exceptions.py - /jinja-kr/src/jinja2/ext.py - /jinja-kr/src/jinja2/optimizer.py - /jinja-kr/src/jinja2/parser.py - /jinja-kr/src/jinja2/py.typed - /jinja-kr/tests/res/templates/foo/test.html - /jinja-kr/tests/res/templates/syntaxerror.html - /jinja-kr/tests/res/templates/broken.html - /jinja-kr/tests/res/templates/mojibake.txt - /jinja-kr/tests/res/templates/test.html - /jinja-kr/tests/res/templates2/foo - /jinja-kr/tests/res/__init__.py - /jinja-kr/tests/res/package.zip - /jinja-kr/tests/conftest.py - /jinja-kr/tests/test_api.py - /jinja-kr/tests/test_runtime.py - /jinja-kr/tests/test_security.py - /jinja-kr/tests/test_compile.py - /jinja-kr/tests/test_core_tags.py - /jinja-kr/tests/test_debug.py - /jinja-kr/tests/test_utils.py - /jinja-kr/tests/test_async.py - /jinja-kr/tests/test_async_filters.py - /jinja-kr/tests/test_bytecode_cache.py - /jinja-kr/tests/test_ext.py - /jinja-kr/tests/test_filters.py - /jinja-kr/tests/test_idtracking.py - /jinja-kr/tests/test_imports.py - /jinja-kr/tests/test_inheritance.py - /jinja-kr/tests/test_lexnparse.py - /jinja-kr/tests/test_loader.py - /jinja-kr/tests/test_nativetypes.py - /jinja-kr/tests/test_nodes.py - /jinja-kr/tests/test_pickle.py - /jinja-kr/tests/test_regression.py - /jinja-kr/tests/test_tests.py - /jinja-kr/.editorconfig - /jinja-kr/.readthedocs.yaml - /jinja-kr/CHANGES.rst - /jinja-kr/README.md - /jinja-kr/tox.ini - /jinja-kr/LICENSE.txt - /jinja-kr/.gitignore - /jinja-kr/.pre-commit-config.yaml - /jinja-kr/pyproject.toml - /jinja-kr/CONTRIBUTING.rst
Jaemin Shin authored- /jinja-main/.devcontainer/devcontainer.json - /jinja-main/.devcontainer/on-create-command.sh - /jinja-main/.editorconfig - /jinja-main/.github/ISSUE_TEMPLATE/bug-report.md - /jinja-main/.github/ISSUE_TEMPLATE/config.yml - /jinja-main/.github/ISSUE_TEMPLATE/feature-request.md - /jinja-main/.github/pull_request_template.md - /jinja-main/.github/workflows/lock.yaml - /jinja-main/.github/workflows/pre-commit.yaml - /jinja-main/.github/workflows/publish.yaml - /jinja-main/.github/workflows/tests.yaml - /jinja-main/.gitignore - /jinja-main/.pre-commit-config.yaml - /jinja-main/.readthedocs.yaml - /jinja-main/CHANGES.rst - /jinja-main/CONTRIBUTING.rst - /jinja-main/LICENSE.txt - /jinja-main/README.md - /jinja-main/artwork/jinjalogo.svg - /jinja-main/docs/Makefile - /jinja-main/docs/_static/jinja-logo-sidebar.png - /jinja-main/docs/_static/jinja-logo.png - /jinja-main/docs/api.rst - /jinja-main/docs/changes.rst - /jinja-main/docs/conf.py - /jinja-main/docs/examples/cache_extension.py - /jinja-main/docs/examples/inline_gettext_extension.py - /jinja-main/docs/extensions.rst - /jinja-main/docs/faq.rst - /jinja-main/docs/index.rst - /jinja-main/docs/integration.rst - /jinja-main/docs/intro.rst - /jinja-main/docs/license.rst - /jinja-main/docs/make.bat - /jinja-main/docs/nativetypes.rst - /jinja-main/docs/sandbox.rst - /jinja-main/docs/switching.rst - /jinja-main/docs/templates.rst - /jinja-main/docs/tricks.rst - /jinja-main/examples/basic/cycle.py - /jinja-main/examples/basic/debugger.py - /jinja-main/examples/basic/inheritance.py - /jinja-main/examples/basic/templates/broken.html - /jinja-main/examples/basic/templates/subbroken.html - /jinja-main/examples/basic/test.py - /jinja-main/examples/basic/test_filter_and_linestatements.py - /jinja-main/examples/basic/test_loop_filter.py - /jinja-main/examples/basic/translate.py - /jinja-main/pyproject.toml - /jinja-main/requirements/build.in - /jinja-main/requirements/build.txt - /jinja-main/requirements/dev.in - /jinja-main/requirements/dev.txt - /jinja-main/requirements/docs.in - /jinja-main/requirements/docs.txt - /jinja-main/requirements/tests.in - /jinja-main/requirements/tests.txt - /jinja-main/requirements/typing.in - /jinja-main/requirements/typing.txt - /jinja-main/scripts/generate_identifier_pattern.py - /jinja-main/src/jinja2/__init__.py - /jinja-main/src/jinja2/_identifier.py - /jinja-main/src/jinja2/async_utils.py - /jinja-main/src/jinja2/bccache.py - /jinja-main/src/jinja2/compiler.py - /jinja-main/src/jinja2/constants.py - /jinja-main/src/jinja2/debug.py - /jinja-main/src/jinja2/defaults.py - /jinja-main/src/jinja2/environment.py - /jinja-main/src/jinja2/exceptions.py - /jinja-main/src/jinja2/ext.py - /jinja-main/src/jinja2/filters.py - /jinja-main/src/jinja2/idtracking.py - /jinja-main/src/jinja2/lexer.py - /jinja-main/src/jinja2/loaders.py - /jinja-main/src/jinja2/meta.py - /jinja-main/src/jinja2/nativetypes.py - /jinja-main/src/jinja2/nodes.py - /jinja-main/src/jinja2/optimizer.py - /jinja-main/src/jinja2/parser.py - /jinja-main/src/jinja2/py.typed - /jinja-main/src/jinja2/runtime.py - /jinja-main/src/jinja2/sandbox.py - /jinja-main/src/jinja2/tests.py - /jinja-main/src/jinja2/utils.py - /jinja-main/src/jinja2/visitor.py - /jinja-main/tests/conftest.py - /jinja-main/tests/res/__init__.py - /jinja-main/tests/res/package.zip - /jinja-main/tests/res/templates/broken.html - /jinja-main/tests/res/templates/foo/test.html - /jinja-main/tests/res/templates/mojibake.txt - /jinja-main/tests/res/templates/syntaxerror.html - /jinja-main/tests/res/templates/test.html - /jinja-main/tests/res/templates2/foo - /jinja-main/tests/test_api.py - /jinja-main/tests/test_async.py - /jinja-main/tests/test_async_filters.py - /jinja-main/tests/test_bytecode_cache.py - /jinja-main/tests/test_compile.py - /jinja-main/tests/test_core_tags.py - /jinja-main/tests/test_debug.py - /jinja-main/tests/test_ext.py - /jinja-main/tests/test_filters.py - /jinja-main/tests/test_idtracking.py - /jinja-main/tests/test_imports.py - /jinja-main/tests/test_inheritance.py - /jinja-main/tests/test_lexnparse.py - /jinja-main/tests/test_loader.py - /jinja-main/tests/test_nativetypes.py - /jinja-main/tests/test_nodes.py - /jinja-main/tests/test_pickle.py - /jinja-main/tests/test_regression.py - /jinja-main/tests/test_runtime.py - /jinja-main/tests/test_security.py - /jinja-main/tests/test_tests.py - /jinja-main/tests/test_utils.py - /jinja-main/tox.ini - /jinja-kr/.devcontainer/devcontainer.json - /jinja-kr/.devcontainer/on-create-command.sh - /jinja-kr/.github/ISSUE_TEMPLATE/feature-request.md - /jinja-kr/.github/ISSUE_TEMPLATE/bug-report.md - /jinja-kr/.github/ISSUE_TEMPLATE/config.yml - /jinja-kr/.github/workflows/tests.yaml - /jinja-kr/.github/workflows/lock.yaml - /jinja-kr/.github/workflows/pre-commit.yaml - /jinja-kr/.github/workflows/publish.yaml - /jinja-kr/.github/pull_request_template.md - /jinja-kr/artwork/jinjalogo.svg - /jinja-kr/docs/_static/jinja-logo-sidebar.png - /jinja-kr/docs/_static/jinja-logo.png - /jinja-kr/docs/examples/cache_extension.py - /jinja-kr/docs/examples/inline_gettext_extension.py - /jinja-kr/docs/Makefile - /jinja-kr/docs/changes.rst - /jinja-kr/docs/license.rst - /jinja-kr/docs/make.bat - /jinja-kr/docs/integration.rst - /jinja-kr/docs/index.rst - /jinja-kr/docs/api.rst - /jinja-kr/docs/sandbox.rst - /jinja-kr/docs/intro.rst - /jinja-kr/docs/tricks.rst - /jinja-kr/docs/conf.py - /jinja-kr/docs/nativetypes.rst - /jinja-kr/docs/templates.rst - /jinja-kr/docs/extensions.rst - /jinja-kr/docs/faq.rst - /jinja-kr/docs/switching.rst - /jinja-kr/examples/basic/templates/subbroken.html - /jinja-kr/examples/basic/templates/broken.html - /jinja-kr/examples/basic/cycle.py - /jinja-kr/examples/basic/debugger.py - /jinja-kr/examples/basic/test_loop_filter.py - /jinja-kr/examples/basic/translate.py - /jinja-kr/examples/basic/inheritance.py - /jinja-kr/examples/basic/test.py - /jinja-kr/examples/basic/test_filter_and_linestatements.py - /jinja-kr/requirements/typing.in - /jinja-kr/requirements/tests.txt - /jinja-kr/requirements/docs.in - /jinja-kr/requirements/docs.txt - /jinja-kr/requirements/tests.in - /jinja-kr/requirements/build.in - /jinja-kr/requirements/build.txt - /jinja-kr/requirements/dev.in - /jinja-kr/requirements/dev.txt - /jinja-kr/requirements/typing.txt - /jinja-kr/scripts/generate_identifier_pattern.py - /jinja-kr/src/jinja2/utils.py - /jinja-kr/src/jinja2/visitor.py - /jinja-kr/src/jinja2/runtime.py - /jinja-kr/src/jinja2/sandbox.py - /jinja-kr/src/jinja2/tests.py - /jinja-kr/src/jinja2/constants.py - /jinja-kr/src/jinja2/filters.py - /jinja-kr/src/jinja2/idtracking.py - /jinja-kr/src/jinja2/lexer.py - /jinja-kr/src/jinja2/loaders.py - /jinja-kr/src/jinja2/meta.py - /jinja-kr/src/jinja2/nativetypes.py - /jinja-kr/src/jinja2/nodes.py - /jinja-kr/src/jinja2/bccache.py - /jinja-kr/src/jinja2/compiler.py - /jinja-kr/src/jinja2/debug.py - /jinja-kr/src/jinja2/defaults.py - /jinja-kr/src/jinja2/environment.py - /jinja-kr/src/jinja2/__init__.py - /jinja-kr/src/jinja2/_identifier.py - /jinja-kr/src/jinja2/async_utils.py - /jinja-kr/src/jinja2/exceptions.py - /jinja-kr/src/jinja2/ext.py - /jinja-kr/src/jinja2/optimizer.py - /jinja-kr/src/jinja2/parser.py - /jinja-kr/src/jinja2/py.typed - /jinja-kr/tests/res/templates/foo/test.html - /jinja-kr/tests/res/templates/syntaxerror.html - /jinja-kr/tests/res/templates/broken.html - /jinja-kr/tests/res/templates/mojibake.txt - /jinja-kr/tests/res/templates/test.html - /jinja-kr/tests/res/templates2/foo - /jinja-kr/tests/res/__init__.py - /jinja-kr/tests/res/package.zip - /jinja-kr/tests/conftest.py - /jinja-kr/tests/test_api.py - /jinja-kr/tests/test_runtime.py - /jinja-kr/tests/test_security.py - /jinja-kr/tests/test_compile.py - /jinja-kr/tests/test_core_tags.py - /jinja-kr/tests/test_debug.py - /jinja-kr/tests/test_utils.py - /jinja-kr/tests/test_async.py - /jinja-kr/tests/test_async_filters.py - /jinja-kr/tests/test_bytecode_cache.py - /jinja-kr/tests/test_ext.py - /jinja-kr/tests/test_filters.py - /jinja-kr/tests/test_idtracking.py - /jinja-kr/tests/test_imports.py - /jinja-kr/tests/test_inheritance.py - /jinja-kr/tests/test_lexnparse.py - /jinja-kr/tests/test_loader.py - /jinja-kr/tests/test_nativetypes.py - /jinja-kr/tests/test_nodes.py - /jinja-kr/tests/test_pickle.py - /jinja-kr/tests/test_regression.py - /jinja-kr/tests/test_tests.py - /jinja-kr/.editorconfig - /jinja-kr/.readthedocs.yaml - /jinja-kr/CHANGES.rst - /jinja-kr/README.md - /jinja-kr/tox.ini - /jinja-kr/LICENSE.txt - /jinja-kr/.gitignore - /jinja-kr/.pre-commit-config.yaml - /jinja-kr/pyproject.toml - /jinja-kr/CONTRIBUTING.rst
cache_extension.py 2.00 KiB
from jinja2 import nodes
from jinja2.ext import Extension
class FragmentCacheExtension(Extension):
# a set of names that trigger the extension.
tags = {"cache"}
def __init__(self, environment):
super().__init__(environment)
# add the defaults to the environment
environment.extend(fragment_cache_prefix="", fragment_cache=None)
def parse(self, parser):
# the first token is the token that started the tag. In our case
# we only listen to ``'cache'`` so this will be a name token with
# `cache` as value. We get the line number so that we can give
# that line number to the nodes we create by hand.
lineno = next(parser.stream).lineno
# now we parse a single expression that is used as cache key.
args = [parser.parse_expression()]
# if there is a comma, the user provided a timeout. If not use
# None as second parameter.
if parser.stream.skip_if("comma"):
args.append(parser.parse_expression())
else:
args.append(nodes.Const(None))
# now we parse the body of the cache block up to `endcache` and
# drop the needle (which would always be `endcache` in that case)
body = parser.parse_statements(["name:endcache"], drop_needle=True)
# now return a `CallBlock` node that calls our _cache_support
# helper method on this extension.
return nodes.CallBlock(
self.call_method("_cache_support", args), [], [], body
).set_lineno(lineno)
def _cache_support(self, name, timeout, caller):
"""Helper callback."""
key = self.environment.fragment_cache_prefix + name
# try to load the block from the cache
# if there is no fragment in the cache, render it and store
# it in the cache.
rv = self.environment.fragment_cache.get(key)
if rv is not None:
return rv
rv = caller()
self.environment.fragment_cache.add(key, rv, timeout)
return rv