日记系统公网(SAE)版
~ 任务需求
- 将上周应用网站发布为公网稳定服务, 可以通过固定域名访问系统:
- 每次运行时合理的打印出过往的所有笔记
- 一次接收输入一行笔记
- 在服务端保存为文件
- 同时兼容 3w 的 Net 版本的命令行界面进行交互
- 可以通过本地命令行工具监察/管理网站:
- 获得当前笔记数量/访问数量等等基础数据
- 可以获得所有笔记备份的归档下载
任务开发记录
SAE 介绍
- PAAS vs VPS
- SAE(Sina App Engine), 新浪应用引擎平台, 就是它给你提供服务器和运行环境, 你只要把你的代码传上去, 它就帮助你的应用运行和维护. 大名鼎鼎的乌云也是托管在 SAE 上的.
一个应用目录下至少要有两个基本文件
一个是
config.yaml
, 内容如下:name: hysic's Diary version: 2
另一个是
index.wsgi
, 替换之前的.py
文件. 例如使用 Bottle 框架的 HelloWorld 例子如下:from bottle import Bottle, run import sae app = Bottle() @app.route('/') def hello(): return "Hello, world! - Bottle" application = sae.create_wsgi_app(app)
当然, 你无须每次都本地写好代码, 然后上传 SAE 看效果, SAE 支持本地开发, python 可以本地安装
pip install sae-python-dev
, 然后进入index.wsgi
所在目录, 运行dev_server.py
, 进入http://localhost:8080
即可本地查看效果.然后就是上传到 SAE 服务器端, git 或 svn 均可, 还是用我们熟悉的 git.
git init git add sae https://git.sinacloud.com/hysic1986 git add --all git commit -m "first commit" git push sae master:1
坑1: 本地测试左侧 tag 边栏显示 OK, 上传 SAE 后无法显示.
- 经 @wp-lai 同学提醒, KVDB 数据库的键值是字典时, 修改后一定要用
kv.set
或kv.replace
函数将修改后的键值存到 KVDB 中.
- 经 @wp-lai 同学提醒, KVDB 数据库的键值是字典时, 修改后一定要用
坑2: 尝试在
/<tag>
子页面中显示对应 tag 的日记, 可是无论如何总是404.- 这个问题就更坑了, 在机场延误无绝期的等待中, 感觉完全找不到解决的办法, 把 route 换成
/任何tag
都可以正常显示, 可用通配符就是不行. - 问题出在通配符的问题. Google
SAE bottle wildcard
无果, 看了几遍 Routing 的官方文档, 终于注意到了 Legacy Syntax 这一小节, 发现<tag>
这种通配符格式是从Bottle 0.10 版本才开始出现的, 而 SAE 中预装的 Bottle 版本呢? 是0.9.6 !!! - 问题找到了, 只要把通配符的格式变成
/:tag
即可. - 问题是解决了, 看起来很简单, 但过程是十分曲折并痛苦的(叠加了机场飞机延误的痛苦), 期间几次尝试在心中使用小黄鸭调试法, 才确定是通配符的问题.
- 这个问题就更坑了, 在机场延误无绝期的等待中, 感觉完全找不到解决的办法, 把 route 换成
KVDB
- SAE 有一套自己的数据库, 就叫 KVDB, 和他家"weibo牌微博"有的一拼.
- KVDB 的 API 只有几个函数, 参考官方说明很容易理解.
- 数据库的 key 主要设置了这几个:
- "diary_num": 记录日记数量
- "access_num": 记录访客数量
- "note"+数字n: 第 n 条日记, 格式为
{"time": current_time, "content": new_line, "tag": tag}
- "tag": 标签dict, key 是标签, value 是相应标签的日记
UI 设计
- 理想状态: google "diary tag" 发现了iOS 应用Tag Journal, 界面很好看.
- 目前状态: 导航栏, 左侧边栏(显示 tags), 提示输入框, 历史日记显示, footer(显示日记数量及访客数量).
CLI 交互
- CLI 访问类似上周的任务, 只是服务器地址由
localhost
变成http://hysic1986.sinaapp.com
, 需要的模块有requests
和lxml
. - 需要的功能包括: 读日记, 写日记, 读取笔记数量, 读取访问数量, 清空日记及统计.
遗留问题
- api 设计?? e.g. 清空日记
- 界面设计??
- 代码越来越复杂, 如何简化或调试??
- 本地测试 边栏tag显示 ok, 上传 sae 无效??