Source code for flask_resty.decorators
import functools
from . import context
from .utils import UNDEFINED
# -----------------------------------------------------------------------------
[docs]def get_item_or_404(func=None, **decorator_kwargs):
"""Make a view method receive an item rather than the item's ID.
This decorator takes the ID fields per `id_fields` on the view class, then
uses them to fetch the corresponding item using the `get_item_or_404` on
the view class.
This function can be used directly as a decorator, or it can be called with
keyword arguments and then used to decorate a method to pass those
arguments to `get_item_or_404`::
class MyView(ModelView):
@get_item_or_404
def get(self, item):
pass
@get_item_or_404(with_for_update=True)
def put(self, item):
pass
:param func: The function to decorate
:type func: function or None
:return: The decorated function or a decorator factory
:rtype: function
"""
# Allow using this as either a decorator or a decorator factory.
if func is None:
return functools.partial(get_item_or_404, **decorator_kwargs)
@functools.wraps(func)
def wrapped(self, *args, **kwargs):
id = self.get_data_id(kwargs)
item = self.get_item_or_404(id, **decorator_kwargs)
# No longer need these; just the item is enough.
for id_field in self.id_fields:
del kwargs[id_field]
return func(self, item, *args, **kwargs)
return wrapped
# -----------------------------------------------------------------------------
def request_cached_property(func):
"""Make the given method a per-request cached property.
This caches the value on the request context rather than on the object
itself, preventing problems if the object gets reused across multiple
requests.
"""
@property
@functools.wraps(func)
def wrapped(self):
cached_value = context.get_for_view(self, func.__name__, UNDEFINED)
if cached_value is not UNDEFINED:
return cached_value
value = func(self)
context.set_for_view(self, func.__name__, value)
return value
return wrapped