运维咖啡吧

追求技术的道路上,我从不曾停下脚步

Sadmin:打造私有Django公共库实现代码复用

我们借助于Django开发了许多的内部管理系统,例如之前介绍过的ProbiusKerriganProxy等等,这些系统看起来长的都一样,但实际实现的功能确是千差万别,这些不同的系统为什么会长的一样呢?这不仅仅是因为它们使用了同一套前端模板,更为重要的是我们将很多大多系统都要用到的基础功能给集中在了一起,封装成了一个基础的Django应用,例如前端页面及常用插件、后端用户及权限管理等等,任何一个Django项目只要集成了这个应用就能快速拥有这些功能,不仅省去了大把的基础功能开发时间,而且对于后续的更新也是非常的友好

设计思路

因为各种各样的原因,我们没有办法把所有的功能都集中在一个系统里,必然会有多个系统的存在,而对于每个系统都有一些基础的功能要实现,例如用户管理、权限管理、日志记录等等,最初的时候我会copy已开发完成项目的基础代码到新项目使用,这样最为简单方便,但若有bug修复或功能更新,我就必须同时修改多个项目的代码,这不仅繁琐还容易出错,为了优化体验,我决定把所有的基础功能从项目中抽离出来,打包成公共应用供项目引用,这个公共应用我们就叫sadmin

打包主要借助setuptools来完成,打包完成后上传至私有仓库,应用服务器中直接通过pip来安装即可,简单方便

主要功能

Sadmin具体包含的功能主要有:

1.集成了基于adminLTE的前端模板,以及常用的前端组件,例如select2、datatables等

2.网站的标题、Title、主题等可后台配置

3.OpenId、LDAP等多种认证方式

4.后台配置菜单,并可根据不同权限显示不同菜单

5.用户、组、部门管理,用户的登录登出

6.自动记录操作日志

7.封装了对于数据库的增删改查

系统开发中会有大量关于数据库的增删改查操作,Django自带的Admin系统很好的实现了这块的功能,但admin后台不仅丑,对于很多稍微复杂点的需求都不好实现,所以我们直接放弃了自带的admin系统,为了方便的进行CRUD,我参考Django的ViewSet封装了两个方法ListCreateViewRetrieveUpdateDestroyView来处理

以对Product表的增删改查为例,后端只需要短短的几行代码就行了

class ProductList(ListCreateView):
    model = Product
    template = 'workflow/product.index.html'
    permission = {'get': 'loginuser', 'post': 'workflow.product_change'}


class ProductDetail(RetrieveUpdateDestroyView):
    model = Product
    permission = {'get': 'workflow.product_select', 'put': 'workflow.product_change',
                  'delete': 'workflow.product_delete'}

几行代码便可以让后端处理对数据库的增删改查,同时返回固定格式的json数据,而对于前端页面就没有太多的规范了,按照喜好怎么设计都可以

除了以上这些主要功能外,还集成了一些例如全站水印、通知发送、数据校验等等其他小功能

使用效果

有了Sadmin,我们在开发的过程中就不需要再来考虑这些基础的功能,更加专注于业务本身,效率提升明显,内部已有将近10个项目使用了Sadmin,运行稳定