猿问

使用装饰器添加一个变量来请求

我知道建议的方法是中间件,但我想实现以下内容来添加api_env在运行时访问的变量,以便我的视图可以访问它:


@api_wrapper

def my_view(request):

    print api_env     # this is the variable I want, such as request.epi_env

和装饰者:


def api_wrapper(func):

    def api_inner(request):

        request.api_env = 'something'

        return func(request)

    return api_inner

最好的方法是什么?我有大约 100 个函数要包装,所以我不想为每个函数添加新参数,但只想使用最简单的方法来传递“env”变量。我该怎么办呢。


慕尼黑的夜晚无繁华
浏览 143回答 2
2回答

慕娘9325324

您可以将其推广到使用任意数量的位置参数和命名参数。此外,您可能想要使用update_wrapper[Python-doc]来添加类似于csrf_exempt“输出”视图的属性,否则@csrf_except在外部函数中将不可用:from functools import update_wrapperdef api_wrapper(func):    def api_inner(request, *args, **kwargs):        request.api_env = 'something'        return func(request, *args, **kwargs)    update_wrapper(api_inner, func, assigned=())    return api_inner话虽这么说,这在某种程度上表明,在这种情况下使用基于类的视图可能会更好,因为这样就可以定义一个mixin,然后将其混合在方法解析顺序 (MRO)中作为可重用组件。在这种情况下,人们通常不必考虑更复杂的逻辑,例如参数或添加到函数中的属性,因为基于类的视图本身会处理这些问题。

红糖糍粑

尝试这个:def api_wrapper():  def decorator(view_func):    @wraps(view_func)    def _wrapped_view(req, *args, **kwargs):      req.env = 'something'      return view_func(req, *args, **kwargs)    return _wrapped_view  return decorator       
随时随地看视频慕课网APP

相关分类

Python
我要回答