经过前几篇教程的学习,相信你对于微信的操作与SAE和webpy都有了些了解,那么这次我想加一个功能,通过mysql来记录用户的反馈,如用户输入fk+内容,然后通过一个页面来显示,最终的效果如下 http://yangyanxing.sinaapp.com/ck
1.老办法,先判断用户提交过来的信息类型,先得是text类型,然后判断是否以fk 开头的message,如果是则写入mysql,然后在urls里设置一下
先启用SAE的mysql应用
你将不会得到具体的用户名与密码等信息,只会得到一个全局变量
2.创建完以后点击“管理MySQL”,进入phpmyadmin界面,很熟悉吧
创建一个叫fk字段数为4的表,你可以一个字段一个字段的定义,将id设置为primary key,AUTO_INCREMENT(A_I),也可以执行下面的sql语句
CREATE TABLE fk(
id INT AUTO_INCREMENT ,
user TEXT,
time TEXT,
fk_content TEXT,
PRIMARY KEY ( id )
)
3.执行以后,返回到应用的代码编辑界面,由于以后会多次用到mysql操作,所以我们将数据库操作写到一个模块中,新建一个model.py,写入以下代码
# _*_ coding:utf-8 _*_
import web
import web.db
import sae.const
db = web.database(
dbn='mysql',
host=sae.const.MYSQL_HOST,
port=int(sae.const.MYSQL_PORT),
user=sae.const.MYSQL_USER,
passwd=sae.const.MYSQL_PASS,
db=sae.const.MYSQL_DB
)
def addfk(username, fktime, fkcontent):
return db.insert('fk', user=username, time=fktime, fk_content=fkcontent)
def get_fkcontent():
return db.select('fk', order='id')
4.打开weixinInterface.py,编辑一下,记得在前面import model
在
if mstype == 'text':
content=xml.find("Content").text
下面加入以下代码
if mstype == 'text':
content=xml.find("Content").text
if content.startswith('fk'):
fktime = time.strftime('%Y-%m-%d %H:%M',time.localtime())
model.addfk(fromUser,fktime,content[3:].encode('utf-8'))
return self.render.reply_text(fromUser,toUser,int(time.time()),u'感谢您的反馈')
由于mysql默认的编码是utf-8,所以这里也将内容进行utf-8转码
5.在urls里添加/ck的定义
打开index.wsgi文件,修改为以下内容
# coding: UTF-8
import os
import sae
import web
import model
from weixinInterface import WeixinInterface
urls = (
'/', 'Hello',
'/weixin','WeixinInterface',
'/ck','feedback',
)
app_root = os.path.dirname(__file__)
templates_root = os.path.join(app_root, 'templates')
render = web.template.render(templates_root)
class Hello:
def GET(self):
#print "你好"
return render.hello("你好")
class feedback:
def GET(self):
fkcon = model.get_fkcontent()
return render.checkfk(fkcon)
app = web.application(urls, globals()).wsgifunc()
application = sae.create_wsgi_app(app)
6.接下来我们来写checkfk的渲染文件
在templates下面新建一个checkfk.html
前端写的好的同学可以美化一下,我前端不好,所以只写了一个简单的表格实现
$def with(fkcontent)
<table border="1" align = center>
<tr>
<th>序号</th>
<th>时间</th>
<th>反馈内容</th>
</tr>
$for item in fkcontent:
<tr>
<td id="tdstyle">$item.id</td>
<td id="tdstyle">$item.time</td>
<td id="tdstyle">$item.fk_content</td>
</tr>
</table>
这里牵扯到webpy的模板实现,里面可以写python代码,但是要以$开头,具体的可以google得到更多的学习
好了,都写好后保存一下吧,在手机上用微信给你的公众账号反馈点内容,以fk(空格)内容发送,然后打开应用
http://yangyanxing.sinaapp.com/ck
7.遗留问题,这里的内容没有进行过滤,可以写点过滤,如空内容无法提交并返回一个友好的提示,牵扯到mysql的应用,还要考虑一些防注入的问题。以后会慢慢完善
 
回顾之前的文章
使用python一步一步搭建微信公众平台(一)----基本的验证与鹦鹉学舌功能
使用python一步一步搭建微信公众平台(二)----搭建一个中英互译的翻译工具
引用来自“诸葛非卿”的评论
这个是在开发者账户下进行的,还是推送帐号下进行的呢?
我的开源项目 django写的单用户微信第三方平台 提供自动回复,查询天气,成绩,空教室等等~~前几天还加上了您写的小黄鸡~~
多交流~~
引用来自“virusdefender”的评论
https://github.com/virusdefender/smart-qdu/tree/master/Weixin
我的开源项目 django写的单用户微信第三方平台 提供自动回复,查询天气,成绩,空教室等等~~前几天还加上了您写的小黄鸡~~
多交流~~
引用来自“NeoCD”的评论
博主加油,多写点,我一直跟进呢。
另外,很感谢楼主的文章,我已经全部照做学习了,还增加了查询天气的功能,再次感谢!还有没有什么别的好玩的功能可以一起交流的不?希望楼主继续啊!~
另外,我把音乐上传到自己的网站,代码写:[r'http://www.fptxyy.com/music/09.mp3',u'音乐',u'音乐'] 在手机微信里打开,并不能播放。在电脑里是正常播放的。
不知怎么解决,望老师指点!谢谢!
引用来自“fptxyy”的评论
(四)里面的代码照抄的,但是翻译功能出不来.def GET(self):
fkcon = model.get_fkcontent()
try:
return render.checkfk(fkcon)
except Exception,e:
print e
如上,在做记录用户反馈这块功能时会出错,然后查看日志定位到了代码报错的地方,自己加了try-except来捕捉错误,再次查看日志提示报错原因为:'utf8' codec can't decode byte 0xd0 in position 28: invalid continuation byte yq26 。请问博主这个出错要怎么修改?
引用来自“caishaobai”的评论
class feedback:def GET(self):
fkcon = model.get_fkcontent()
try:
return render.checkfk(fkcon)
except Exception,e:
print e
如上,在做记录用户反馈这块功能时会出错,然后查看日志定位到了代码报错的地方,自己加了try-except来捕捉错误,再次查看日志提示报错原因为:'utf8' codec can't decode byte 0xd0 in position 28: invalid continuation byte yq26 。请问博主这个出错要怎么修改?
我的表里有一个字段是微信的id(微信post来的那个),名字叫做weixin_id,我更新数据的函数如下:
def update(weixinID, t_guid):
db.update('user_info', vars={'weixinID': weixinID}, where='weixin_id=$weixinID', guid=t_guid)
这样子guid这个值还是始终不变。我觉得是没有找到符合weixin_id=weixinID这个条件的字段,所以数据被更新进去。那么,是不是要进行编码转换呢?
我试过weixinID.encode('utf-8'),仍然没效果。
weixin_id字段是utf-8_bin的
请问该如何解决
试了web.db的update和query,都不行
引用来自“hgold”的评论
自己写的一个 .pyd 文件,如何传到新浪SAE上?