项目就是一个博客,我用类视图来统计文章的浏览量,代码如下:
class DetailView(generic.DetailView):
model = Article
template_name = 'blog/detail.html'
context_object_name = 'article'
def get_object(self):
obj = super(DetailView, self).get_object()
# 设置浏览量增加时间判断,同一篇文章两次浏览超过半小时才重新统计阅览量,作者浏览忽略
u = self.request.user
ses = self.request.session
the_key = 'is_read_{}'.format(obj.id)
is_read_time = ses.get(the_key)
if u != obj.author:
if not is_read_time:
obj.update_views()
ses[the_key] = time.time()
else:
now_time = time.time()
t = now_time - is_read_time
if t > 60 * 30:
obj.update_views()
ses[the_key] = time.time()
我的方式就是在 session 里面设置一个绑定文章 ID 的 key,然后每次一个用户第一次浏览的时候就来判断这个 key 有没有一个时间值,如果有就跟当前时间做对比,然后大于半小时就添加一次阅读(当做回阅),如果没有,就说明是新的读者,直接更新浏览量,并且设置一个时间值给 key。
这个方法本身问题不大,可以根据我的要求来更新浏览量,至少同一个用户刷新页面不会使得浏览量增加,但是我发现有 2 个问题:
1、当前用户没有登录的时候流量文章,文章量增加(这个过程没问题),然后用户登录账号重定向到文章页,文章浏览量增加(这个也说的过去,我就当他们是两个不同的用户吧),但是用户注销登录,再次浏览文章,文章又增加浏览量,也就是说,这个注销登录过程使得 session 里面的 key 被删除了,请问,我改怎么改进这个?
2、使用爬虫(比如 python 的 requests )来访问文章,每次访问都可以使得浏览量增加,也就是说 session 的这个设置过程对爬虫请求无效
上面两个问题是我比较纠结的地方,我觉得主要是我对 session 理解不过吧,想通过这个实例来进一步理解 session 的使用,有请大佬们生出援手,给我讲解一下我这个该怎么改,或者说有什么更好的实现方式。
博客链接,你们可以试试我说的上述两种问题(请不要使用爬虫发送大量请求) http://www.tendcode.com/
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.