假设我有以下模型-
RewriteRule ^category/([0-9a-zA-Z-]+)/page/([0-9a-zA-Z_-]+) category.php?cat=$1&pagi=$2 [NC,L]
现在,我想添加一个记录器,只要该方法成功地开始和结束到此class Banana(models.Model):
name = models.CharField(max_length=255)
def get_banana(self):
return f'Banana: {self.name}'
方法,该记录器就会生成日志。
记录器如下-
get_banana
所以我创建了一个记录器装饰器-
class Log(models.Model):
type = models.CharField(max_length=255)
message = models.CharField(max_length=255)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey()
如何将此装饰器添加到我的def log_status(f):
def wrapper(**fields):
Log.objects.create(**{k: (v if k != 'message' else v + ':STARTED') for k, v in fields.items()})
return_value = f()
Log.objects.create(**{k: (v if k != 'message' else v + ':COMPLETED') for k, v in fields.items()})
return return_value
return wrapper
方法中?
以下内容不起作用,因为它看不到get_banana
。
self
答案 0 :(得分:0)
由于您正在装饰一种方法,因此self
实际上可供装饰器使用。它在解析时将不可用,但肯定会在运行时可用。您需要做的就是像这样更改装饰器:
def log_status(function):
def wrapper(self, *args, **kwargs):
return_value = function(self, *args, **kwargs) # do whatever you want here
return return_value
return wrapper
仅此而已。现在,在运行时,装饰器可以使用self并将其传递给装饰器,并且您的函数应按预期执行。