1. Why Python?
我曾经使用过Java、PHP、Ruby和Python来开发Web应用,至于为什么使用Python作为XWEB的语言,其实最主要的原因:
-
Ruby不再需要新的WEB开发框架,Rails统治了一切。
-
PHP没有多线程,对于后台数据处理有些吃力。
-
Java其实非常好,但不是脚本,仅此而已。
4. 特性
-
一个轻量级的MVC框架和ORM框架。
-
采用工作单元组织数据模型,提供级联查询,延时加载, N+1⇒1+1 ,短事务,全局唯一ID, 乐观离线锁和 Identity Map 等特性,能有效防止数据库死锁的发生等。
-
ConnectionManager 管理工作单元内的数据库链接,支持跨库提交,跨库事务等。
5. 设计思想和组织架构
本框架有一个 ORM 框架和一个 MVC 框架构成,其主要设计思想如下:
5.1. 设计原则
-
约定优于配置。框架内置许多约定内容。
-
配置文件项目唯一,配置文件最先加载到内存。
-
数据库链接、Cache链接等全部采用 LazyLoad 模式加载,由 ConnectionManager 和 CacheManager 等类统一管理,
不提供预加载,需要时到配置中读取所需的数据。
-
基于MVC架构,抛弃MVT模式,业务逻辑依托 Controller 类 来组织,方便代码复用和重构。
-
领域实体的名字 要 含义明确,全局唯一, 数据库表名 ,尽量全局唯一。
例如:admindb中的user表表示管理员用户,而wwwdb中的user表表示注册用户,是不允许的,至少加上前缀,如admin_user。
-
从代码组织上讲,分库优于分表,因此不提供分表功能,请大家尽量采用分库来代替分表
-
轻量级,可运行于console程序
-
事务、数据安全等提供内置的解决方案,覆盖大部分case的情况。譬如:从 cache 和 从库 中取出的数据是不允许写入主库;
跨库事务提交失败回滚等。
5.2. 框架结构
-
一个 XWEB项目 的代码结构如下,
每个子项目(app)共用 配置文件settings.yaml , 领域实体 , service , const , util 等,但是有各自的 controller 和 templates ,如: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
-
每个域名一个 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 来覆盖其默认配置。
www 、 admin 、 script 等子项目均使用同一份配置。
拿 ID 来说,有些业务实体的 ID 是没有含义,有时候仅仅是为了让 INNODB 更有效率,如:
user_friend_ref 表,有三个字段:_id ,user_id ,friend_id ,没有人会关心id字段
对于主键有意义的业务实体,统一使用全局唯一ID,如:
XWEB代码
user = User.createByBiz()
order = Order.createByBiz()
order.user_id = user.id
如果使用 Django 的 ORM ,要写出:
Django代码
user = User()
user.save()
order = Order()
order.user_id = user.id
order.save()
from https://github.com/lifei/xweb