我想要执行以下操作:每次用户输入文章时,它会将访问次数增加+1,但仅在用户首次登录时增加,因此我必须保存用户已进入某个页面的事实地点。但我没有使用身份验证或类似的东西。
我知道我可以使用javascript存储在LocalStorage中,但我仍然不知道如何在后端使用APIS。
在后端执行此操作最简单的方法是什么?
目前增量的功能如下。注意:我创建一个新对象,而不是使用“instance.visits + = 1”之类的东西,因为我需要保存每次访问的日期以过滤在一段时间内访问次数更多的帖子,这是唯一的方法我知道了。
class ArticlePage(Page):
# ....
def serve(self, request, *args, **kwargs):
request.is_preview = getattr(request, 'is_preview', False)
self.views.create(date=datetime.datetime.now())
self.save()
print(self.views.all().count())
return TemplateResponse(
request,
self.get_template(request, *args, **kwargs),
self.get_context(request, *args, **kwargs)
)
class ArticlePageViews(models.Model):
article = models.ForeignKey(
ArticlePage,
on_delete=models.CASCADE,
related_name='views'
)
date = models.DateTimeField()
def __str__(self):
return f'{self.date}'
这是使用cookie的可能性
class ArticlePage(Page):
# ....
def serve(self, request, *args, **kwargs):
request.is_preview = getattr(request, 'is_preview', False)
if not 'cookie_name' in request.COOKIES:
self.views.create(date=datetime.datetime.now())
self.save()
print(self.views.all().count())
response=TemplateResponse(
request,
self.get_template(request, *args, **kwargs),
self.get_context(request, *args, **kwargs)
)
response.set_cookie('cookie_name', 'cookie_value')
return response
请参考qazxsw poi设置cookie的过期时间
由于您只需要每个用户一个视图,因此您无法将视图存储在用户会话中,因为会话在用户登录时会发生更改。我建议您在用户首次访问您的网站时设置UUID cookie并设置很长的有效期,比如10年。这可以通过中间件来完成:
this
请记住将中间件添加到设置中。现在,在ArticlePageViews模型中,您可以设置unique_together约束:
# middleware.py
import uuid
class UUIDMiddleware:
"""
Middleware to set a UUID cookie when a user visits
for the first time.
"""
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
if not request.COOKIES.get('user_uuid'):
user_uuid = str(uuid.uuid4())
# set cookie in request so it can be used on the first visit
request.COOKIES['user_uuid'] = user_uuid
response = self.get_response(request)
max_age = 60 * 60 * 24 * 365 * 10 # 10 years
response.set_cookie('user_uuid', user_uuid, max_age=max_age)
return response
return self.get_response(request)
在你看来(只是一个例子):
class ArticlePageViews(models.Model):
article = models.ForeignKey(
ArticlePage,
on_delete=models.CASCADE,
related_name='views'
)
user_uuid = models.UUIDField()
date = models.DateTimeField(auto_now_add=True) # set datetime automatically
class Meta:
unique_together = ('article', 'user_uuid')
def __str__(self):
return f'{self.date}'