1. 开发语言及框架

Python + Flask + Bootstrap,数据库使用的是MySQL

2. 相关文档及Lib库

  1. Bootstrap官方文档 http://v3.bootcss.com/getting-started/
  2. 微信公众号开发文档 https://mp.weixin.qq.com/wiki
  3. Python 微信SDK https://github.com/zwczou/weixin-python/
  4. PDF 《FlaskWeb开发:基于Python的Web应用开发实战》
  1. 那些坑
    3.1 微信
    3.1.1 微信登陆
    首先你需要仔细阅读官方文档,简单来说微信登陆有如下几步:
  1. 生成微信认证跳转URL,注意有snsapi_basesnsapi_userinfo两种方式,前者是静默授权只获取用户openid,后者需要用户手动同意获取用户基本信息
  2. 获取access_token
  3. 获取用户信息
    详细信息可以参考文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

解决微信OAuth2.0网页授权只能设置一个回调域名的问题,参考 https://github.com/HADB/GetWeixinCode
Python微信SDK,参考 https://github.com/zwczou/weixin-python/
3.1.2 模版消息
登陆微信公众平台 -> 功能 -> 模版消息,选择右侧模版消息接口文档 ,即可查看详细的接口文档。
主要步骤如下:
1)获取access_token,其中token有效期为7200s,而且微信限制了每天的调用次数,这里使用functools.lru_cache维护了一个token的内存缓存
2)获取模版ID
3)请求接口
POST URL: https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
POST Data: 请求包为 json

3.2 MySQL
3.2.1 编码问题
MySQL遇到最大的坑还是编码问题,因为涉及到获取微信用户名含有各种emoji表情的问题,需要设置字符编码为utf8mb4,具体可以参考这篇文章(https://mathiasbynens.be/notes/mysql-utf8mb4),然而设置成功在Flask SQLAlchemy配置app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root@localhost:3306/test?charset=utf8mb4’后,运行报错sqlalchemy.exc.OperationalError: (_mysql_exceptions.OperationalError) (2019, "Can't initialize character set utf8mb4 (path: C:\\mysql\\\\share\\charsets\\)"),解决无果。
最终解决方案是:

  1. Flask SQLAlchemy配置app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root@localhost:3306/test?charset=utf8'
  2. 微信用户名写入数据库时使用repr()方法将写入原始unicode字符,读取的时候再使用eval()进行转换

3.2.2 SQLAlchemy查询数据转换为Dict

for u in session.query(User).all():u = dict(u.__dict__)u.pop('_sa_instance_state', None)

参考文章:

  1. https://stackoverflow.com/questions/1958219/convert-sqlalchemy-row-object-to-python-dict
  2. http://www.kaka-ace.com/sqlalchemy-model-to-dict/

3.4 Flask
3.4.1 cookie相关

  1. 设置cookie
    @app.route(‘/set_cookie’)
def set_cookie():response=make_response('Hello World');response.set_cookie('Name','Joo')return response
  1. 获取cookie
    @app.route(‘/get_cookie’)
def get_cookie():name=request.cookies.get('Name')return name
  1. 删除cookie

设置过期时间为0
@app.route(‘/del_cookie’)

def del_cookie():response=make_response('delete cookie')response.set_cookie('Name','',expires=0)return response

使用delete_cookie方法
@app.route(‘/del_cookie’)

def del_cookie():response=make_response('delete cookie')response.delete_cookie('Name')return response

3.4.2 flask.make_response() 实例
https://www.programcreek.com/python/example/51527/flask.make_response
3.4.3 详细解读Jquery各Ajax函数:.get(),.get(),.get(),.post(),.ajax(),.ajax(),.ajax(),.getJSON()
http://www.cnblogs.com/liuling/archive/2013/02/07/sdafsd.html
3.4.4 bootstrap对话框插件
http://bootboxjs.com
3.4.5 Flask flash增加link
https://stackoverflow.com/questions/21248718/how-to-flashing-a-message-with-link-using-flask-flash
3.4.6 HTML颜色编码
http://www.tutorialspoint.com/html/html_color_names.htm
3.4.7 Python缓存
微信获取access_token时有效期是7200s,而且微信限制了每天的调用频率(2000次/天),所以简单使用lru_cache在内存中维护了一个token缓冲,示例代码如下:

@lru_cache(None)

def getAccessToken():url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}'.format(app_id, app_secret)r = requests.get(url)access_token = r.json().get('access_token')time_now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")print '[{0}] getAccessToken Result:\t{1}'.format(time_now, r.text)return access_token, datetime.now()
def getToken():token, t = getAccessToken()if (datetime.now() - t).seconds > 3600:getAccessToken.cache_clear()token, t = getAccessToken()return tokenelse:return token

参考:

http://blog.konghy.cn/2016/04/20/python-cache/
https://docs.python.org/3.4/library/functools.html#functools.lru_cache

3.4.8 修改Bootstrap使用国内源
由于默认Bootstrap使用的CDN是http://cdnjs.cloudflare.com,国内访问较慢,所以需要修改默认CDN为国内源。
找到C:\Python27\Lib\site-packages\flask_bootstrap_init_.py(C:\Python27 为你当前Python版本路径),在文件最后找到如下代码:

bootstrap = lwrap(WebCDN('//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/%s/' %BOOTSTRAP_VERSION), local)jquery = lwrap(WebCDN('//cdnjs.cloudflare.com/ajax/libs/jquery/%s/' %JQUERY_VERSION), local)html5shiv = lwrap(WebCDN('//cdnjs.cloudflare.com/ajax/libs/html5shiv/%s/' %HTML5SHIV_VERSION))respondjs = lwrap(WebCDN('//cdnjs.cloudflare.com/ajax/libs/respond.js/%s/' %RESPONDJS_VERSION))

复制代码
替换为国内源cdn.bootcss.com,代码如下:

bootstrap = lwrap(WebCDN('//cdn.bootcss.com/twitter-bootstrap/%s/' %BOOTSTRAP_VERSION), local)jquery = lwrap(WebCDN('//cdn.bootcss.com/jquery/%s/' %JQUERY_VERSION), local)html5shiv = lwrap(WebCDN('//cdn.bootcss.com/html5shiv/%s/' %HTML5SHIV_VERSION))respondjs = lwrap(WebCDN('//cdn.bootcss.com/respond.js/%s/' %RESPONDJS_VERSION))

复制代码
参考资料:
https://zhuanlan.zhihu.com/p/23412590
http://www.bootcdn.cn/

3.4.9 flask部署
flask通常在Linux上部署方式是 flask + wsgi + nginx,windows上则是flask + iis + nginx。这里实际部署的环境是Windows Server 2007,由于项目实际访问量较小的关系,最终选用简单的flask + tornado部署方式。
在flask项目里原来的入口程序假设为run.py的同级目录添加tornado_server.py,内容如下:
复制代码

coding:utf-8

from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from run import app
http_server = HTTPServer(WSGIContainer(app))

address为实际访问URL,port为端口号

http_server.listen(port=5000, address=“127.0.0.1”)
IOLoop.instance().start()
复制代码
使用python tornado_server.py即可启动。

参考文档:
https://www.cnblogs.com/kiddy/p/5749687.html
https://segmentfault.com/q/1010000005641722?_ea=849637
http://flask.pocoo.org/docs/0.11/deploying/

参考博客:
https://www.cnblogs.com/lovesoo/p/8427697.html

Python Flask微信公众号开发相关推荐

  1. 使用Python进行微信公众号开发(二)接收消息

    写在前面 <使用Python进行微信公众号开发>系列文章将与大家分享如何使用Python一步步搭建微信公众号后台服务器. 效果体验 扫码"是雯子吖"公众号进行体验 配置 ...

  2. 基于python的微信公众号开发教程_基于python的微信公众号开发教程

    应广大python学员的期盼,九宝老师精心制作的"基于python的微信公众号开发"视频教程即将上线. 该课程秉承九宝培训一贯的"简单.高效.快速"的讲课原则, ...

  3. 视频教程-基于python的微信公众号开发教程-微信开发

    基于python的微信公众号开发教程 微信企业号星级会员.10多年软件从业经历,国家级软件项目负责人,主要从事软件研发.软件企业员工技能培训.已经取得计算机技术与软件资格考试(软考)--"信 ...

  4. 使用Python进行微信公众号开发(三)回复消息

    写在前面 <使用Python进行微信公众号开发>系列文章将与大家分享如何使用Python一步步搭建微信公众号后台服务器. 效果体验 扫码"是雯子吖"公众号进行体验 配置 ...

  5. 基于python的微信公众号开发

    最近想自学服务器方面的知识,用微信公众号开发来练手.阅读了一些文章,实践以后总结一下. 租了腾讯云服务器,操作系统为 Ubuntu Server 14.04.1 LTS 64位,分配了一个公网IP地址 ...

  6. Flask 微信公众号开发

    公众号接口 1. 公众号消息会话 目前公众号内主要有这样几类消息服务的类型,分别用于不同的场景. 群发消息 公众号可以以一定频次(订阅号为每天1次,服务号为每月4次),向用户群发消息,包括文字消息.图 ...

  7. python训练营微信公众号真实性_用python进行微信公众号开发(仅测试学习)

    今天看到篇教程,是用python开发微信公众号的,觉得有意思,就敲代码实现了一下,成功后更觉得好玩,故记录,方便开发深入时使用. 基础背景介绍: 首先得有个人微信号(没有自行注册),为方便测试学习: ...

  8. Python进行微信公众号开发

    一.微信公众号的准备: 1. 注册 访问地址:https://mp.weixin.qq.com/ 按照提示注册即可 注意:本文样例使用个人公众号,由于个人公众号没有接口权限,自定义菜单无法进行开发,同 ...

  9. python 微信公众号开发[1] 后台服务器端配置与公众号开发配置

    更新时间:2020年3月7日 微信公众号开发的硬件必备条件:(1)申请一个公众号 (2)有公网ip的服务器(最好是阿里云,腾讯云等的云服务器)(3)解析到(2)中服务器地址的域名(阿里云,腾讯云购买即 ...

  10. Python微信公众号开发平台

    上大学的时候,对微信公众号开发浅尝辄止的玩了一下,感觉还是挺有意思的. //www.jb51.net/article/133677.htm后来服务器到期了,也就搁置了.由于发布web程序,使用PHP很 ...

最新文章

  1. 在多变环境中长期定位和建图的通用框架
  2. 【队列源码研究】消息队列beanstalkd源码详解
  3. elasticsearch插件(4)
  4. 计算机习题2,计算机应用习题2
  5. 配置方法_经济权配置账户与六类经济项——经济权配置方法认识
  6. kubesphere3.0的安装完整文档
  7. pgadmin4 python
  8. Swift实战-小QQ(第2章):QQ侧滑菜单
  9. SAP Spartacus B2B 页面信息提示图标的弹出窗口显示实现逻辑
  10. seaborn画图设置横纵坐标标签
  11. 次表面散射材质_游戏开发者怎么做出以假乱真的画面效果?大气散射渲染了解一下...
  12. SpringBoot之注解
  13. iStack详解(三)——iStack多主检测方式
  14. Java I/O总结——OutputStream
  15. asymptotic (infinite-training-sample)
  16. word ftl操作
  17. ServerPropertiesAutoConfiguration.class cannot be opened because it does not exist
  18. 辞职信:写给我的“藤野先生”
  19. 各大网盘搜索资源神器免费送!!!
  20. 双击打开.bat文件闪退

热门文章

  1. AXI Memory-Mapped SRIO收发控制器
  2. 哈夫曼树的构造和哈夫曼编码实现详细讲解(含例题详细讲解)
  3. 自然语言处理核心期刊_计算机核心期刊
  4. 小米手机删除的便签怎么找回
  5. win10系统打开/解压缩文件时出现文件名乱码
  6. 卢松松大鱼号收入859元
  7. 2020年Spring学习笔记目录
  8. 备件管理系统c语言,图书管理系统的设计与开发及体育用品库存管理系统设计.doc...
  9. Android 蓝牙配对、连接和通信
  10. 智慧校园市场调研与解决方案落地规划