web.py得到页面浏览数的办法

2012-08-30 04:01:23 +08:00
 paloalto
项目中要得到页面的点击查看数,不知道如何实现。

先学习v2ex的思路,发现是用了GAE的taskqueue,我的理解是:在打开一个帖子时,同时会向/hit/topic/xxx这个地址发送请求(在任务队列中),把topic_key传过去,TopicHitHandler会根据topic_key去数据库中给hit字段加1.

from google.appengine.api.labs import taskqueue
#.....
taskqueue.add(url='/hit/topic/' + str(topic.key()))
#.....
class TopicHitHandler(webapp.RequestHandler):
def post(self, topic_key):
topic = db.get(db.Key(topic_key))
if topic:
topic.hits = topic.hits + 1
topic.put()
#.....
def main():
('/hit/topic/(.*)', TopicHitHandler)

后来看了web.py的文档,觉得web.py的background似乎和GAE的taskqueue差不多:
“web.background (and web.backgrounder) are python function decorators which allow you to execute a function in a separate background thread to that thread which served the current HTTP request and later report back on the status of the background thread (the stdout of the background function is in effect returned to the "backgrounder" that initiated the thread”

不知道我理解的对不对,不过看文档里似乎不建议用web.background——提到“handle with care”。这让我有点犹豫。

不知道除了用web.background之外,还有没有其他的办法来处理得到页面浏览数的问题?
3632 次点击
所在节点    Python
16 条回复
paloalto
2012-08-30 04:11:00 +08:00
用Celery似乎是个解决办法?
待我去研究研究先。
davidx
2012-08-30 10:29:52 +08:00
其实, 你还可以使用google的analytics
mikale
2012-08-30 12:46:40 +08:00
用js是最简单的办法,加载页面js会执行,然后发送ajax请求给后端,然后后端做一个记录就是了
hbc
2012-08-30 12:53:24 +08:00
你在每个 view handler return 之前增加一下数据库里的浏览次数就好了……
yetone
2012-08-30 15:38:41 +08:00
你要查看的就是『数据库的读取次数』
paloalto
2012-08-30 17:04:20 +08:00
@davidx
@mikale
@hbc
@yetone

看来我想多了,@hbc 的办法似乎是最简单的。

class photo_single:
def GET(self, id):
img = image.get_img_by_id(id)
if img:
#.......
image.add_img_hit(id)#浏览数字段加1
#.......
return view.photo_single()

这样的结果会是每次刷新页面都会+1?虽然不是很合理,但是既然V2EX是这么做,那我也先这么写吧。

@davidx 用google analytics做这个的话怕是有点绕远路吧?
@mikale 用js也是个办法,我原先怎么没想到呢。
@yetone 数据库的读取次数我不知道怎么得到,O_O

我先按@hbc 的办法写,然后再想想怎么排除那种一个人单独刷新的情况。好像每次增加数据库里的浏览次数之前需要判断一下访客的id是否发生了变化的?但那样就好像变成“多少人浏览”而不是“多少次浏览”了。
paloalto
2012-08-30 17:18:28 +08:00
成功给浏览数+1了。

CoX
2012-08-30 17:24:47 +08:00
刷新算一次点击很正常吧,现在v2ex应该也是这样计算的
davidx
2012-08-30 17:37:09 +08:00
@paloalto google analytics带给你的功能, 绝不只是页面访问次数
访问者的浏览器信息, 浏览器语言, 国家, 等等各种信息, 都有
paloalto
2012-08-30 17:45:38 +08:00
@davidx 但我觉得GA更适合大范围的网站统计啊,把每条数据从GA读出来显示在对应的每个页面,好像没有网站这么做吧。GA提供了这方面的api吗?
paloalto
2012-08-30 17:52:32 +08:00
@CoX 是的,V2EX现在也是这么做的。

豆瓣相册的做法是“xxx人浏览”,而且只能相册主人自己能看到。是按人来统计,多次刷新页面不会发生变化。
flickr的是“xx次检视”,多次刷新页面也不会发生变化,估计也是按人来算的,只是换了个说法而已。
CoX
2012-08-30 17:56:35 +08:00
@paloalto 这样的话,肯定有一张表来记录浏览过的人吧;
一般情况下,没这个必要吧。
paloalto
2012-08-30 18:00:23 +08:00
@CoX 对,豆瓣和flickr都没法查看哪些人浏览了某张图片,因为这样的确是没什么必要。

不过应该可以不用表记录浏览过的人就可以得到多少人浏览过的,把这个数记到一个字段里就可以,但现在我还没想出怎么按人来记录浏览数。
paloalto
2012-08-30 18:03:20 +08:00
@CoX 仔细想了一下,好像还真要像你说的那样要一张表来记录浏览过的人。因为需要判断这个人以前有没有浏览过。。
jamiesun
2012-09-02 21:42:52 +08:00
根据ip。或者cookie来计算
xlaok
2012-09-02 21:59:09 +08:00
@mikale +1一直都是这么做的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/46469

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX