目标
在上周开发基础上, 完成 极简交互式笔记的 PaaS 版本。需求如下:
将上周应用网站发布为公网稳定服务
- 可以通过固定域名访问系统:
- 每次运行时合理的打印出过往的所有笔记
- 一次接收输入一行笔记
- 在服务端保存为文件
同时兼容 3w 的 Net 版本的命令行界面进行交互
- 可以通过本地命令行工具监察/管理网站:
- 获得当前笔记数量/访问数量等等基础数据
- 可以获得所有笔记备份的归档下载
任务初步分解
- Paas 是一种云服务。可以通过网上的平台进行软件开发。
Platform as a service ( PaaS ) is a category of cloud computing services that provides a platform allowing customers to develop, run, and manage Web applications without the complexity of building and maintaining the infrastructure typically associated with developing and launching an app.
分解
- 有哪些paas 平台可利用,优缺点
- 平台运用
- 基础:sae
- 管理/分类:kvdb
- 命令行界面交互
- 工具管理: 访问统计
- 4w 遗留
- jinjia2
- bootstrap
- 数据库
- ipython
Paas及SAE
Paas 类似于在硬件、数据库管理层和软件编写层之间的一个平台接口,使开发者专注于软件逻辑,不用关心硬件部署、存储、备份等更底层的东西。优势就是节省了开发者的时间和精力,前几年云计算很火,但发展不快现在还有些会被iaas替代的争议,但总体应该是未来的趋势。SAE(新浪云)主要面对开发者,国内发展时间最长,对开发者的支持相对最完善。 新浪SAE、阿里云与盛大云 的比较
数据存储与KVDB
how to use python in the web 提到数据在web server上有3种存储方式:
relational database / use ORM
- sql,
- sql lite, split
text 文件
object oriented database
KVDB 这种 key-value 型数据结构好像应该归位第3类,它更符合web 2.0 和大数据背景下海量的离散数据的现状。为了简单本来想在SAE上也用txt存储,但提示web server error,可能是SAE禁止文件写入操作。
KVDB 数据结构
[*] 分类、收集、管理 利用key:value 中的key, 将key 设置为
:'录入时间',这样可以区分同一TAG下不同时间的记录。 - 但如果多客户端同时输入会被覆盖,同时不能区分不同客户端,以后再改进。
[ ] 备份 暂时未处理,方向
- kvdb类里好像有相同功能参数 - SAE storage
进展
web 端
web端开发很简单,直接借鉴w4的成果, 原来的函数略作修改。
CLI 实现
CLI 交互界面 在原网页上通过requests 实现cli 交互感觉很困难,好多细节需处理。想到另开一个'\cli'的网页用来处理与CLI客户端的交互。这样也可以不用处理html,发送与接收都是字符串(有无其它方式?)。总体举得server和client的对标签的设定、管理蛮复杂的,按照mvp原则逐步实现,先验证接收历史消息 > 标签接收 > ...
问题
control character error kv的 key值不能含有空格。直接在python编译器里尝试效率最高
如何判断kv里没有数据,几种思路
- kv class 里有相关函数/属性 - help 没有查到
- google - 与null 比较,貌似也不对
- getkeys_by_prefix[''] 实验了下如果没有prefix其实就是所有的keys - ok
客户端/服务器交互 在CLI下如何处理标签花了很多时间。为了偷懒,把cli的各种操作都在服务器URL上有单独页面处理。时间主要花在是处理各种报错上,有很多值得总结的地方,可惜当初对问题记录不及时。经验主要是,出错时尽量多的打印过程、在函数返回值里面有执行结果的反馈。
小结 review了小赖同学的代码,很值得学习。
- KVDB 的数据结构设置。提起考虑了很多统计功能,有计数器。 前期思考时没有考虑清楚, 想走捷径
列表推导式、beautifulsoap 的使用 有很多细节,前面只想尽快完成任务,实际上并没有掌握。因此在新的任务下,回潜意识的排斥用。
例子:
# 排序
tmp = [item[1] for item in list(kv.get_by_prefix('key'))]
results = sorted(tmp, key = lambda x:x['time'], reverse=True)
# 多个标签处理
tags = request.forms.get('tags').replace(',',' ').replace(',',' ').split()
tags = [tag.lower() for tag in tags]
content = '\n'.join([row[0]+'>>'+row[1] for row in previous_content])