Python 如何从装饰器向基于Django类的视图添加/修改属性?
我有一个基于类的Django视图,如下所示:Python 如何从装饰器向基于Django类的视图添加/修改属性?,python,django,django-class-based-views,python-decorators,Python,Django,Django Class Based Views,Python Decorators,我有一个基于类的Django视图,如下所示: class myView(TemplateView): template_name = 'templateFile.html' request = None @method_decorator(request_management) def dispatch(self, request, *args, **kwargs): ... return super(myView, self).
class myView(TemplateView):
template_name = 'templateFile.html'
request = None
@method_decorator(request_management)
def dispatch(self, request, *args, **kwargs):
...
return super(myView, self).dispatch(request, *args, **kwargs)
def get_context_data(self, *args, **kwargs):
ctx = super(newFeatures, self).get_context_data(**kwargs)
ctx['requester'] = self.requester
return ctx
在我的request_管理decorator中,我想将myView.request的值设置为传递到dispatch函数中的参数。所以我做了这样的事情:
def request_management(function):
@wraps(function)
def decorator(*args, **kwargs):
logger.debug("request = %s" % str(args[0]))
# I want to say here something like:
# self.request = args[0]
# but of course, "self" is not defined in this context.
return function(*args, **kwargs)
return decorator
但是在decorator中,我无法访问decorated方法的“self”实例。
如何获取该实例并向其附加名为request的属性,以便在该实例的其他方法中使用该属性?方法装饰器的目的是。但是,既然您正在编写自己的decorator,那么您可以继续编写它作为实际的方法decorator:
class myView(TemplateView):
@request_management
def dispatch(self, request, *args, **kwargs):
...
return super(myView, self).dispatch(request, *args, **kwargs)
def request_management(method):
@wraps(method)
def decorator(self, request, *args, **kwargs):
logger.debug("request = %s" % str(request))
self.request = request
return method(self, request, *args, **kwargs)
return decorator
我在下面回答,但您是否知道已在基于类的视图中为您创建了
self.request
?看,不。我不知道。非常感谢。但我还需要将其他参数作为属性添加到self中。我敢肯定你做得不对。根据我的经验,覆盖dispatch
几乎从来都不是正确的策略。此外,在处理基于类的视图时,考虑使用MIXIN通常是一个好主意。你到底想达到什么目的?