有一项任务是为了教育目的添加查看帖子的能力(有作弊的可能性)。我在网上找到这段代码:
模型.py:
class PageHit(models.Model):
url = models.CharField(max_length=1000, unique=True)
count = models.PositiveIntegerField(default=0)
意见.py:
from django.db.models import F
from functools import wraps
from django.db import transaction
def counted(f):
@wraps(f)
def decorator(request, *args, **kwargs):
with transaction.atomic():
counter, created = PageHit.objects.get_or_create(url=request.path)
counter.count = F('count') + 1
counter.save()
return f(request, *args, **kwargs)
return decorator
这个装饰器环绕view显示帖子。
代码运行良好,当你点击链接转到帖子时,浏览量确实增加了,但我不明白这个功能是如何工作的。请解释。
每次,在调用
view此装饰器包装的 given 之前,PageHitgiven都会随着 givenurl递增count:我建议您阅读装饰器的工作原理。简单回答你的问题:
f是我们包装的实际函数,在本例中是我们的函数view(所以我们在最后调用它)。decorator这是一个相当混乱的标题,因为 它不是装饰器。counted在这个例子中,它是一个装饰器,这里调用的decorator通常是调用wrapper,这是一个替换(包装)正在解码的函数的函数:相当于:
F- django ORM 辅助方法,用于通过 SQL 与 DB 进行更多“低级”通信。正如我上面所写,您可以使用更简单的方法+=。wraps用于保留所声明函数的原始名称 (view.__name__) 和原始文档 (view.__doc__)。否则,它的名称将被(在本例中)替换为decorator,并且文档将丢失,因为。它decorator没有文档字符串。get_or_create返回一个包含两个值的元组(object, created)- 创建或找到的对象,布尔值是通过 URL 创建或找到的已存在于数据库中的对象。可用于_未使用的变量:但
created更直观(恕我直言)。