Pages

Monday, 16 December 2013

XWEB框架是一款基于Python的Web开发框架



1. Why Python?

我曾经使用过Java、PHP、Ruby和Python来开发Web应用,至于为什么使用Python作为XWEB的语言,其实最主要的原因:
  1. Ruby不再需要新的WEB开发框架,Rails统治了一切。
  2. PHP没有多线程,对于后台数据处理有些吃力。
  3. Java其实非常好,但不是脚本,仅此而已。

2. 开发这个框架的目的:

2.1. 现有框架的问题

  1. 现有框架如 Django, SQLAlchemy 无法解决实际开发过程的一些问题,如全局唯一ID,短事务,N+1等。
  2. 现有框架如 Django, SQLAlchemy 设计地过于复杂,各种坑爹配置,没有统一的标准,让使用者无从下手或者无法精通。

2.2. 新框架的优势

  1. 约定优于配置 COC
  2. 统一的开发流程和代码规范
  3. 新的特性

3. 主要思想

马丁福勒的《企业应用架构模式》一书

4. 特性

  1. 一个轻量级的MVC框架和ORM框架。
  2. 采用工作单元组织数据模型,提供级联查询,延时加载, N+1⇒1+1 ,短事务,全局唯一ID, 乐观离线锁和 Identity Map 等特性,能有效防止数据库死锁的发生等。
  3. ConnectionManager 管理工作单元内的数据库链接,支持跨库提交,跨库事务等。

5. 设计思想和组织架构

本框架有一个 ORM 框架和一个 MVC 框架构成,其主要设计思想如下:

5.1. 设计原则

  1. 约定优于配置。框架内置许多约定内容。
  2. 配置文件项目唯一,配置文件最先加载到内存。
  3. 数据库链接、Cache链接等全部采用 LazyLoad 模式加载,由 ConnectionManagerCacheManager 等类统一管理, 不提供预加载,需要时到配置中读取所需的数据。
  4. 基于MVC架构,抛弃MVT模式,业务逻辑依托 Controller 来组织,方便代码复用和重构。
  5. 领域实体的名字 要 含义明确,全局唯一, 数据库表名 ,尽量全局唯一。 例如:admindb中的user表表示管理员用户,而wwwdb中的user表表示注册用户,是不允许的,至少加上前缀,如admin_user。
  6. 从代码组织上讲,分库优于分表,因此不提供分表功能,请大家尽量采用分库来代替分表
  7. 轻量级,可运行于console程序
  8. 事务、数据安全等提供内置的解决方案,覆盖大部分case的情况。譬如:从 cache从库 中取出的数据是不允许写入主库; 跨库事务提交失败回滚等。

5.2. 框架结构

  1. 一个 XWEB项目 的代码结构如下, 每个子项目(app)共用 配置文件settings.yaml领域实体serviceconstutil 等,但是有各自的 controllertemplates ,如:www、admin等。
    /domain         - 领域文件夹
        /entity         - 领域实体类
        /object         - 非领域实体类
        /service        - 领域服务类
        /const          - 常量
    /www            - www子app
        /controller     - 控制器类
        /templates      - 模板文件夹
        /wwwroot        - 静态文件
        index.py        - 入口文件
    /admin          - admin子app
        /controller     - 控制器类
        /templates      - 模板文件夹
        /wwwroot        - 静态文件
        index.py        - 入口文件
    /config         - 配置文件目录
        /nginx          - Nginx配置文件夹
        /sql            - 数据库SQL文件夹
        /uwsgi          - uwsgi配置文件夹
        settings.yaml   - 配置文件
    /util           - util目录
    /scrpt          - 后台脚本目录
    /svc            - svc目录: 存放svc运行目录
    /bin            - bin目录:存放项目独立的工具,如:shell
  2. 每个域名一个 app ,启动单独的 uwsgi ,如需要泛域名、静态化等需求,请在 nginx 层处理。

6. 名词解释

  • app: 以域名划分,例如,一个项目有前台,后台,图片等服务,分别为www.xxx.com, admin.xxx.com和img.xxx.com,则分别对应www,admin和img的app
  • controller: 以业务需求划分,例如:用户相关操作,订单操作分别属于UserController和OrderController,需要登录的在Controller的基类中实现或者在before方法中实现
  • Action: 一次具体的请求,如:下单,可标示为: controller/action,此为默认地址,rewrite规则书写方式为: c=controller&a=action。

7. 编码规范

变量名:unix命名法
函数名:骆驼命名法
类名: 匈牙利命名法
1. 只有一种配置,就是最佳配置。
项目的配置文件存放在 config 目录下的 settings.py 文件,不同的环境可使用 settings_local.py 来覆盖其默认配置。 wwwadminscript 等子项目均使用同一份配置。
ID 来说,有些业务实体的 ID 是没有含义,有时候仅仅是为了让 INNODB 更有效率,如: user_friend_ref 表,有三个字段:_iduser_idfriend_id ,没有人会关心id字段 对于主键有意义的业务实体,统一使用全局唯一ID,如:
XWEB代码
user = User.createByBiz()
order = Order.createByBiz()
order.user_id = user.id
如果使用 DjangoORM ,要写出:
Django代码
user = User()
user.save()
order = Order()
order.user_id = user.id
order.save()
 
from https://github.com/lifei/xweb