在SAE上用Bottle写微信公众平台应用遇到问题,求帮带 - V2EX
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 6733 次点击
    这是一个创建于 4714 天前的主题,其中的信息可能已经有所发展或是发生改变。
    下面是我写的简单的接受消息并回复原消息的函数,但是未能接受到回复,签名验证函数没贴出来,但测试已经通过了。

    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     Solana     3194 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 34ms UTC 00:37 PVG 08:37 LAX 16:37 JFK 19:37
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86