为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑的夜晚无繁华 2023-10-26 14:30:49
我知道建议的方法是中间件,但我想实现以下内容来添加api_env在运行时访问的变量,以便我的视图可以访问它:@api_wrapperdef 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”变量。我该怎么办呢。
查看完整描述

2 回答

?
慕娘9325324

TA贡献1783条经验 获得超4个赞

您可以将其推广到使用任意数量的位置参数和命名参数。此外,您可能想要使用update_wrapper[Python-doc]来添加类似于csrf_exempt“输出”视图的属性,否则@csrf_except在外部函数中将不可用:

from functools import update_wrapper


def 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)中作为可重用组件。在这种情况下,人们通常不必考虑更复杂的逻辑,例如参数或添加到函数中的属性,因为基于类的视图本身会处理这些问题。


查看完整回答
反对 回复 2023-10-26
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

尝试这个:


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       


查看完整回答
反对 回复 2023-10-26
  • 2 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信