天使汇开发流程简介

python

  • 闭包
  • 正则表达式
  • collections
  • defaultdict
  • itertools
  • enum
  • IntEnum
  • enumerate
  • time.mktime(time.strptime(“2007-03-04 21:08:12”, “%Y-%m-%d %H:%M:%S”))
  • dateparser
  • python 的 新式类与旧式类 , 以及super的意义

supervisor

  • 线上服务器如何看异常

开发流程

新建一个页面通常需要创建几个文件:

  • 模板 zapp/SITE/model/模块名.py
  • 视图 zapp/SITE/view/模块名.py
  • Coffee Script 脚本 coffee/SITE/auth/模块名/视图名.coffee
  • Make 模板 html/SITE/auth/模块名/视图名.html
  • CSS 样式文件 css/SITE/auth/模块名.css

并在 _url.py 中注册视图。

  • 新建url页面
  • render
  • css,js的引用
  • merge.conf
  • 新建css,js,修改merge.conf需要重启开发服务器
  • View的类型
  • 分页
  • 在页面取得当前用户
  • 搜索
  • 自动补全
  • gearman 异步调用
  • JsOb
  • rendermail 发送邮件
  • redis key的定义 , R.
  • model 中 使用绝对路径import以防止redis提示key重复定义
  • import _env
  • 配置文件 的 定义 与 自适应
  • make.py 生成配置文件

Mako 模板

Mako 模板的存放路径通常是 42web/html/SITE/模块名/文件名.html。 Mako 模板的使用见 教程 ,通用部分通常需要剥离成一个 _base.html 文件中, 不被直接 render 的模板命名以下划线 _ 开头。

一个基本的模板文件大概是这样的:

  1. ## 这里继承父模版
  2. <%inherit file="/SITE/_base/default.html" />
  3. ## 添加头文件、CSS 文件
  4. <%block name="head">
  5. <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0, width=device-width">
  6. ## 这里引入 CSS 文件,将目录名中的斜线换成下划线作为变量传入
  7. <link rel="stylesheet" href="${css.SITE_auth_m}" />
  8. </%block>
  9. <%block name="script">
  10. ## 在文件尾引入 JS 文件,变量名同为替换后的目录名,JS 文件来自于变异 Coffee Script
  11. <script src="${js.SITE_auth_m_m}"></script>
  12. </%block>

Coffee Script

网页脚本用 Coffee Script,写完后需编译为 JavaScript (添加新的 CS 脚本需要手动重启 dev.sh 脚本,修改已存在的脚本会自动变异成 JS)。

Python Model

数据存储使用的是 MongoDB,通过封装过的 MongoKit 将数据 model 对应上 MongoDB 文档, 需要 from z42.web.mongo import mongo 。下面是一个简单的 model 文件示例:

  1. from z42.web.mongo import Doc
  2. from z42.web.mongo import mongo
  3. class UserIM(Doc):
  4. structure = {
  5. 'user_id': int,
  6. 'phone': basestring,
  7. 'qq': basestring,
  8. 'weixin':basestring
  9. }

创建一个 UserIM 对象使用 upsert() 方法,如 UserIM({'phone': PHONE}).upsert({user_id: 1001}) , 这行代码的作用是:如果存在 user_id 为 1001 的 UserIM,则将其 ‘phone’ 设置为 PHONE, 否则在 MongoDB 中插入这样一个 JSON 文档: {‘user_id’: 1001, ‘phone’: PHONE}。

Python View

  • View
  • HostView
  • LoginView
  • AdminView
  • GodView
  • JsonErrView
  • RpcView
  • 组合 View

web 开发使用的框架是修改过的 Tornado,需要通过装饰器注册 URL。 新建一个简单的 view 如下:

  1. from _route import route
  2. from z42.web.view.j import JsonErrView
  3. from jsob import JsOb
  4. from zapp.SITE.view._base import HostView
  5. @route('/m/register/')
  6. class register(HostView):
  7. def get(self, sign):
  8. self.render()
  9. @route('/j/m/')
  10. class _(JsonErrView, HostView):
  11. def post(self, sign):
  12. err = JsOb() # 使用 JsOb 对象保存错误信息
  13. o = self.json # 获取 JSON 化的 POST 信息
  14. if not o.title:
  15. err.title = "链接已失效!"
  16. if not err:
  17. do_something()
  18. self.render(err)

这个 module 注册了两个 view,一个注册页面和一个 Ajax 接口。route 方法是一个用于注册 URL 的装饰器, 装饰在 Handler class(通常继承自XxxView)上即可。

register class 就是视图 Handler 的最简写法。对于 Ajax 视图,Handler 名意义不大,可以使用下划线命名。 需要返回错误提示的视图,可以继承 JsonErrView。View 的继承用法详见 视图介绍

上线流程

  • 修改函数接口后, 用ag查找并修改些调用过的地方
  • 函数命名规则 :名词在前动词在后 , 常用命名如下
  • user_new 新建
  • user_rm 删除
  • user_dumps 返回一个包含各种相关数据的json对象
  • user_id_list_by_com_id(limit, offset) 查询
  • user_new 新建
  • user_rm 删除
  • user_dumps 返回一个包含各种相关数据的json对象
  • user_id_list_by_com_id(limit, offset) 查询
  • user_id_count_by_com_id

我们通常把user_id作为第一个参数