Skip to content

Commit 4176ca0

Browse files
committed
feat: support call template_filter without parens
1 parent a5f9742 commit 4176ca0

File tree

2 files changed

+45
-5
lines changed

2 files changed

+45
-5
lines changed

src/flask/sansio/app.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -662,20 +662,36 @@ def add_url_rule(
662662

663663
@setupmethod
664664
def template_filter(
665-
self, name: str | None = None
666-
) -> t.Callable[[T_template_filter], T_template_filter]:
665+
self, name: t.Callable[..., t.Any] | str | None = None
666+
) -> t.Callable[[T_template_filter], T_template_filter] | T_template_filter:
667667
"""A decorator that is used to register custom template filter.
668668
You can specify a name for the filter, otherwise the function
669669
name will be used. Example::
670670
671-
@app.template_filter()
672-
def reverse(s):
673-
return s[::-1]
671+
@app.template_filter()
672+
def reverse(s):
673+
return s[::-1]
674+
675+
The decorator also can be used without parentheses::
676+
677+
@app.template_filter
678+
def reverse(s):
679+
return s[::-1]
674680
675681
:param name: the optional name of the filter, otherwise the
676682
function name will be used.
677683
"""
678684

685+
if callable(name):
686+
# If name is callable, it is the function to register.
687+
# This is a shortcut for the common case of
688+
# @app.template_filter
689+
# def func():
690+
691+
func = name
692+
self.add_template_filter(func)
693+
return func
694+
679695
def decorator(f: T_template_filter) -> T_template_filter:
680696
self.add_template_filter(f, name=name)
681697
return f

tests/test_templating.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,30 @@ def my_reverse(s):
129129
assert app.jinja_env.filters["my_reverse"] == my_reverse
130130
assert app.jinja_env.filters["my_reverse"]("abcd") == "dcba"
131131

132+
@app.template_filter
133+
def my_reverse_2(s):
134+
return s[::-1]
135+
136+
assert "my_reverse_2" in app.jinja_env.filters.keys()
137+
assert app.jinja_env.filters["my_reverse_2"] == my_reverse_2
138+
assert app.jinja_env.filters["my_reverse_2"]("abcd") == "dcba"
139+
140+
@app.template_filter("my_reverse_custom_name")
141+
def my_reverse_3(s):
142+
return s[::-1]
143+
144+
assert "my_reverse_custom_name" in app.jinja_env.filters.keys()
145+
assert app.jinja_env.filters["my_reverse_custom_name"] == my_reverse_3
146+
assert app.jinja_env.filters["my_reverse_custom_name"]("abcd") == "dcba"
147+
148+
@app.template_filter(name="my_reverse_custom_name_2")
149+
def my_reverse_4(s):
150+
return s[::-1]
151+
152+
assert "my_reverse_custom_name_2" in app.jinja_env.filters.keys()
153+
assert app.jinja_env.filters["my_reverse_custom_name_2"] == my_reverse_4
154+
assert app.jinja_env.filters["my_reverse_custom_name_2"]("abcd") == "dcba"
155+
132156

133157
def test_add_template_filter(app):
134158
def my_reverse(s):

0 commit comments

Comments
 (0)