V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
paloalto
V2EX  ›  Python

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

  •  
  •   paloalto · 2012-08-30 04:01:23 +08:00 · 3620 次点击
    这是一个创建于 4450 天前的主题,其中的信息可能已经有所发展或是发生改变。
    项目中要得到页面的点击查看数,不知道如何实现。

    先学习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之外,还有没有其他的办法来处理得到页面浏览数的问题?
    16 条回复    1970-01-01 08:00:00 +08:00
    paloalto
        1
    paloalto  
    OP
       2012-08-30 04:11:00 +08:00
    用Celery似乎是个解决办法?
    待我去研究研究先。
    davidx
        2
    davidx  
       2012-08-30 10:29:52 +08:00
    其实, 你还可以使用google的analytics
    mikale
        3
    mikale  
       2012-08-30 12:46:40 +08:00
    用js是最简单的办法,加载页面js会执行,然后发送ajax请求给后端,然后后端做一个记录就是了
    hbc
        4
    hbc  
       2012-08-30 12:53:24 +08:00
    你在每个 view handler return 之前增加一下数据库里的浏览次数就好了……
    yetone
        5
    yetone  
       2012-08-30 15:38:41 +08:00
    你要查看的就是『数据库的读取次数』
    paloalto
        6
    paloalto  
    OP
       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
        7
    paloalto  
    OP
       2012-08-30 17:18:28 +08:00
    成功给浏览数+1了。

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

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

    不过应该可以不用表记录浏览过的人就可以得到多少人浏览过的,把这个数记到一个字段里就可以,但现在我还没想出怎么按人来记录浏览数。
    paloalto
        14
    paloalto  
    OP
       2012-08-30 18:03:20 +08:00
    @CoX 仔细想了一下,好像还真要像你说的那样要一张表来记录浏览过的人。因为需要判断这个人以前有没有浏览过。。
    jamiesun
        15
    jamiesun  
       2012-09-02 21:42:52 +08:00
    根据ip。或者cookie来计算
    xlaok
        16
    xlaok  
       2012-09-02 21:59:09 +08:00
    @mikale +1一直都是这么做的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2963 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 14:43 · PVG 22:43 · LAX 06:43 · JFK 09:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.