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
melaozhu
V2EX  ›  Python

在SAE上用Bottle写微信公众平台应用遇到问题,求帮带

  •  
  •   melaozhu ·
    laozhu · 2013-01-07 10:01:44 +08:00 · 6268 次点击
    这是一个创建于 4342 天前的主题,其中的信息可能已经有所发展或是发生改变。
    下面是我写的简单的接受消息并回复原消息的函数,但是未能接受到回复,签名验证函数没贴出来,但测试已经通过了。

    https://gist.github.com/e13438a06eae2324a43b

    觉得问题可能出在没有能够正确获取到POST数据,但是在Bottle下面该如何获取POST数据呢?用 request.POST.get('keyname','') 的话,我不知道微信POST的数据 keyname 是什么啊,在Bottle中有没有类似PHP中 $GLOBALS["HTTP_RAW_POST_DATA"] 或者flask中类似 request.data 的方法呢。

    第一次在V2EX发帖好紧张,求帮带。。。
    24 条回复    1970-01-01 08:00:00 +08:00
    cooper
        1
    cooper  
       2013-01-07 10:05:09 +08:00
    file_get_contents("php://input")
    替换
    $GLOBALS["HTTP_RAW_POST_DATA"]
    chairo
        2
    chairo  
       2013-01-07 10:05:12 +08:00   ❤️ 2
    Bottle 可以参考一下我这段代码:
    http://www.au92.com/archives/weixin-api.html
    melaozhu
        3
    melaozhu  
    OP
       2013-01-07 10:09:54 +08:00
    @chairo 之前参考着兄台的代码写的,不过那个 allitems() 方法没见过,在Bottle API也没找着,能否给个链接呢?有没有其他的方法可以取得这个POST数据呢?
    sharkli
        4
    sharkli  
       2013-01-07 10:13:03 +08:00
    一楼正解。
    luztak
        5
    luztak  
       2013-01-07 10:13:26 +08:00
    request.POST应该有个list/dict保存POST数据吧
    melaozhu
        6
    melaozhu  
    OP
       2013-01-07 10:14:13 +08:00
    https://gist.github.com/4471752

    我贴的代码好像是secret的,对不住大家,补贴一下代码
    melaozhu
        7
    melaozhu  
    OP
       2013-01-07 10:16:11 +08:00
    @cooper
    @sharkli 那个方法是PHP的,我想要的是Python下的。。。
    melaozhu
        8
    melaozhu  
    OP
       2013-01-07 10:17:20 +08:00
    @luztak 恩,是个字典,如果是表单POST过来,那通过key取value就可以了。但是微信客户端POST过来的数据,我不知道key啊,如题
    chairo
        9
    chairo  
       2013-01-07 10:17:51 +08:00
    allitems你看新版的bottle里是有这个方法的,如果sae的版本太低,你可以在你应用的目录放自己的新版bottle,不用sae自带的那个

    可以看看我另一个项目中在sae可用的bottle文件,我记着只是简单修改一点点地方就能用上官方的bottle的
    https://bitbucket.org/chairo/mxiong/src/18bc90dced2fd4d7d492752aad9ef8d4ea0980cb/core/bottle.py?at=default
    chairo
        10
    chairo  
       2013-01-07 10:19:56 +08:00   ❤️ 1
    @melaozhu 我印象中微信post过来的数据,这个内容不是放在value中,而是一个key

    所以你用什么key去取POST下数据都不成,需要遍历一下POST,然后取key中内容,而不是取value…
    chaojie
        11
    chaojie  
       2013-01-07 10:21:56 +08:00   ❤️ 1
    没有request.body吗
    melaozhu
        12
    melaozhu  
    OP
       2013-01-07 10:24:17 +08:00
    @chairo 额,兄台,这个项目好工口哦 <3 。。。 继续请教,如果是不用allitems方法,有没有其他方法获取这个POST DATA呢?
    melaozhu
        13
    melaozhu  
    OP
       2013-01-07 10:26:34 +08:00
    @chaojie 这个有的, request.body - The HTTP request body as a seek-able file-like object. Depending on MEMFILE_MAX, this is either a temporary file or a io.BytesIO instance.

    但这个可以取到从微信POST过来的数据吗?
    chairo
        14
    chairo  
       2013-01-07 10:28:50 +08:00   ❤️ 1
    @melaozhu 没有试过
    但是你看bottle代码中也是有这么应用的(版本0.12-dev,github中取下来代码中根目录的bottle.py文件)


    而想将最新版bottle应用到sae,只要自己修改下,我拿我bitbucket项目中的可在sae使用的bottle.py和现在的0.12.dev版本对比了下,印象中没记错的地方就是「subprocess」这个东西sae不支持,过滤掉就可以了
    melaozhu
        15
    melaozhu  
    OP
       2013-01-07 10:31:30 +08:00
    @chairo 好吧,这正是我看你那篇文章疑惑的地方 doc = libxml2dom.parseString(key) ,那么POST中的key-value对如果只有一对,就不需要遍历啦。
    chairo
        16
    chairo  
       2013-01-07 10:35:11 +08:00
    @melaozhu 我那个代码只能做参考,但代码在线上跑的是没有问题的。微信的api做的比较诡异……
    melaozhu
        17
    melaozhu  
    OP
       2013-01-07 10:38:03 +08:00
    @chairo 非常感谢,先用兄台的方案解决之。

    如果能用 request.POST.get('keyname', '') 解决就话就更好了,知情人能告诉我微信POST数据有木有keyname,keyname是什么就万分感谢了。

    还有 @chaojie 兄所说的 request.body 在该场景下是否可行呢?
    chairo
        18
    chairo  
       2013-01-07 10:40:59 +08:00
    @melaozhu : @chaojie 兄弟说的request.body应该才是正经的解决办法,微信的api只能在线上调试,太不方便了,我实在懒的去尝试其他方式了。
    melaozhu
        19
    melaozhu  
    OP
       2013-01-07 10:49:20 +08:00
    @chairo 看到flask和web下面的 request.data 就在想,为什么bottle下面木有类似的方案。如果这个可以,这个话题就结了。
    iloahz
        20
    iloahz  
       2013-01-07 11:14:19 +08:00
    @melaozhu
    @chaojie
    @chairo

    虽然很歪楼,还是想求各位大神给个python激活码啊,[email protected],万分感谢
    luztak
        21
    luztak  
       2013-01-07 11:53:10 +08:00
    @melaozhu 有肯定是有,不过没公开。毕竟py没有private。
    我说的意思是 截包看看含有微信数据的key......难道它把数据放在key里么- -#
    qdcanyun
        22
    qdcanyun  
       2013-01-08 09:55:14 +08:00 via iPad   ❤️ 1
    request.body
    这有个我写的微信python的sdk。。。
    文档和样例还没写。等我考完试就补上。。。
    希望能对你有帮助
    qdcanyun
        23
    qdcanyun  
       2013-01-08 10:14:26 +08:00 via iPad
    xiaomayi0323
        24
    xiaomayi0323  
       2013-03-12 16:12:15 +08:00
    我也是卡在那了,整整一天,最后还是在Stackoverflow上找到了答案
    就是用request.body.read()方法拿到微信Post过来的XML数据
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6017 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:10 · PVG 10:10 · LAX 18:10 · JFK 21:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.