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

2013-01-07 10:01:44 +08:00
 melaozhu
下面是我写的简单的接受消息并回复原消息的函数,但是未能接受到回复,签名验证函数没贴出来,但测试已经通过了。

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

我贴的代码好像是secret的,对不住大家,补贴一下代码
melaozhu
2013-01-07 10:16:11 +08:00
@cooper
@sharkli 那个方法是PHP的,我想要的是Python下的。。。
melaozhu
2013-01-07 10:17:20 +08:00
@luztak 恩,是个字典,如果是表单POST过来,那通过key取value就可以了。但是微信客户端POST过来的数据,我不知道key啊,如题
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
2013-01-07 10:19:56 +08:00
@melaozhu 我印象中微信post过来的数据,这个内容不是放在value中,而是一个key

所以你用什么key去取POST下数据都不成,需要遍历一下POST,然后取key中内容,而不是取value…
chaojie
2013-01-07 10:21:56 +08:00
没有request.body吗
melaozhu
2013-01-07 10:24:17 +08:00
@chairo 额,兄台,这个项目好工口哦 <3 。。。 继续请教,如果是不用allitems方法,有没有其他方法获取这个POST DATA呢?
melaozhu
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
2013-01-07 10:28:50 +08:00
@melaozhu 没有试过
但是你看bottle代码中也是有这么应用的(版本0.12-dev,github中取下来代码中根目录的bottle.py文件)


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

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

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

虽然很歪楼,还是想求各位大神给个python激活码啊,iloahz@gmail.com,万分感谢

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

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

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

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

© 2021 V2EX