这篇总结会讲述一个新手从项目开始到提交项目到服务器的酸甜苦辣,说实话有点吃力。我试图阅读开发指南,但我仍然不知道为什么。一开始想按照之前开发论坛的方法在本地Pycharm上进行开发和手动功能测试,试了试却被告知无法连接微信,因为没有分配独立IP。只能老老实实从配置服务器入手。如何设置我的第一台服务器?迷迷糊糊按照黄老板的教程安装了nginx和uwsgi,并配置了服务器。关注了一下自己的测试公众号,进入帮助后,欣喜的发现了一条回复信息。我真是激动得说不出话来。虽然可以运行,但是直接在服务端写代码太难了。幸运的是,我发现了Pycharm的远程同步功能。打开Tool>Deployment>Configuration,会出现如下窗口。输入您自己的用户名和密码,并在右栏中编辑映射。然后你可以在Tool>Deployment>Options中设置触发同步的时机。我选择的是Oneexplicitsaveaction,这样编辑好的代码在使用Ctrl+S的时候可以自动同步到服务器!Bindingandexpressions然后开始开发我的第一个函数式绑定~简单看了前后端接口的文档,发现可以让我实现validate_user方法。实现方法是直接通过https://id.tsinghua.edu.cn进行验证,通过查看返回的url判断输入的学号和密码是否匹配。同步代码,打开微信,输入学号和密码,测试OK然后我需要计算一个通过微信输入的四个算术表达式。简单看一下微信公众号回复消息的原理:大概是微信服务器发送一个XML给我们的服务器,经过解析提取,提取出一个包含各个字段内容的字典msg,然后赋值给每个handlerinput,调用检查每个处理程序的方法,如果返回True,则执行其处理方法。所以我们只需要写一个handler来接收四个算术表达式形式的微信消息,通过result=eval(self.input['Content'])将表达式作为Python语句执行,并得到它的返回值。~在绑定第11集的过程中,发现我们的验证失败了:服务器无法直接访问我们清华内网的所有网页。如何解决?SoftworksBLOG1——使服务器能够连接清华内网。我尝试了贾老师的openconnect+Juniper的方法,可以将我们的服务器连接到校园网VPN访问我们的内部网页。但是想了想,还是觉得不对劲。一来偶尔会影响我使用校园网,二来服务器在访问资源的时候也会出错。过了几天,我们惊奇的发现外网竟然可以访问我们的网校了~我们去观察网校在POST学号和密码时的行为,把整个验证方式改成了网校。验证方式与id略有不同。session=requests.session()session.post(url=alter_targeturl,data=alter_postdata)response=session.get(check_url)前后端接口之前完成绑定功能时,没有办法读取整个项目去渲染和展示网页,导致一开始有点迷茫,不知从何下手。后来看了开发指南和前后端接口,才渐渐明白在浏览器输入域名,回车到显示网页之间发生了什么。完成活动详情,管理微信菜单,即完成每个视图并注册为url的处理方法。明白了原理之后,工作就会顺畅很多。按照前后端接口文档中的顺序依次完成GET和POST。这部分工作其实并没有太多的技术含量,就是根据需求在数据库模型中找到一个或多个结果,然后将它们转换成一个字典和一个JSON可以识别的返回值。可能有点难,因为每个方法需要仔细考虑检查什么,剩下的就是认真写,慢慢整理bug。微信用户功能完成了管理员界面,最后要实现我们的抢票退票等核心功能。类似于当时的表达方式,我们通过微信消息输入来识别用户想要执行的操作,在具体的handler中实现功能,然后返回合适的信息给用户。表达对整体的工作原理有了很好的理解,所以这部分工作还算顺利。可以提一下的是抢票部分的逻辑:可以说是有点复杂,但是只要仔细想想,应该是没有问题的。剩下的只是代码的实现。值得注意的是,抢票不同于其他操作,可能存在并发导致的错误(比如两个请求同时更新Activity表中剩余的票,可能会导致计数错误),所以必须使用这部分为数据库在操作中加上transaction.atomic():dosomething(),这样数据库操作就会由django.transaction来管理,成为一个原子操作,不会出现并发时数据出错的问题。在测试项目结束时,需要对一些重要的功能进行单元测试和功能测试。在配置环境的时候踩了很多坑:一开始想在本地Python3.6+phantomjs环境下跑测试,结果一直发现跑不起来。找了半天,发现整个项目有个语句(datetime.now())Python3.6的函数调用方式会出错,至今没有修复。然后我想在服务器环境中正常运行。尝试了很久,发现在服务器上配置Phantomjs会出现一些问题。最后老老实实在本地安装Python3.5,从头开始安装环境,终于可以跑测试了=。=按照讲义编写单元测试和功能测试。可能和讲义上的TDD开发方式完全不一样。我的测试基本是语句覆盖==的白盒测试,帮助我重新梳理了判断的思路,发现了一些bug。但是,各个部分一般都没有变化,有时甚至有点纠结。我的功能代码错了吗?还是我的测试写错了?在实现抢票指令的功能测试时,需要模拟微信向服务器发送消息。我这里一直写错误访问的url,给我带来了很多麻烦。。。查了资料,发现测试时可以直接访问的本地服务器url,可以通过StaticLiveServerTestCase中的成员live_server_url获取(否则写127.0.0.1会被服务器Rejected)url=self.live_server_url+'/wechat'response=requests.post(url=url,data=post_data)这样才能真正模拟发送给服务器的消息!部署我的微信项目终于完成部署在http://139.199.25.172,这里可以操作管理员界面~可能是我的项目在实际运行中BUG比较多。。。我会在后续的检查中继续完善~
