比较完整的 Django 项目经验分享,值得学习。
作者:kinegratii
来源:https://kinegratii.github.io/2017/07/31/django-full-stack-note/
概述
BWS项目是自己一年来在开发的项目。本文就项目中一些技术选型、功能实现、项目流程做一些简单的总结。
python3
虽然Python3发布已经10年之久,但是2和3之争直到今天依旧存在,对于如何学习,每个人都有自己的理解和学习策略。我个人看法:
果断学习面向未来的3;
3和2的差别对于学习过程没有太多的影响,学好了3自然也能够很快上手2了;
常见的第三方库大多数(80%以上)是支持Python3的;
不过在系统安装的时候总是23共存的,可以自由切换;
今年4月份重新开发的时候做了一个比较激进的做法:完全抛弃对Python2的支持。当时的考量,把这个项目作为Django持续学习的一个示范项目,毕竟 Django的下一个大版本2.0(预计2017年12月发布),也已经要求最低版本为3.5了。
其实在项目中使用几个Python2不支持的语法和没有的标准库,就可以达到以上目的,具体来说,在代码中使用了以下几个语法:
字典合并创建语法(PEP448)
强制关键字传参(PEP3102)
根据 PEP448,在Python3.5中可以使用更加简洁明了的代码实现合并多个字典。
另外Python3在文本和二进制方面作了比较大的改变,这对文件导入导出功能开发提供了便利,不用再纠结2的编码问题,可以集中解决业务层面的问题。
Django
我也算是Django的忠实用户了,从1.4到1.11都有用到,不断看到Django的成长和壮大。1.4/1.8/1.11是LTS版本,项目使用的是1.10。这些年来Django比较大的变更有:
自定义用户类型:这个是1.5就有的功能了,之前只能使用内置的用户类,连使用邮箱作为用户名也不能直接支持;
数据库迁移:1.7借鉴 South 实现的,这个是开发的利器,修改用户模型时候可以使用命令一键将修改同步到数据库,而忽略具体的数据库类型;
自定义过滤查询:1.7,这个主要用于封装一些业务数据库查询。
多模板支持:1.8引入的,Django自己的模板引擎效率历来为人们所诟病,现在可以在Django中使用Jinja2这样的模板了。
表单控件支持模板渲染:Django表单其实是着重于后端验证,前端相对薄弱,导致定制起来没有那么顺手。最新的1.11引入的可以通过模板文件定制控件样式等等。
CBV
强烈建议使用 Class-Based-View 组织视图处理函数。
Class-Based-View 是相对于Function-Based-View而言,主要支持封装,减少重复的代码编写工作,逻辑流程清晰,经过测试过的。在具体编写代码还是一定要查看源代码,才能理解其中的功能实现。
CBV的核心是Mixin模式。
Mixin是一种将多个类中的功能单元的进行组合的利用的方式,这听起来就像是有类的继承机制就可以实现,然而这与传统的类继承有所不同。通常mixin并不作为任何类的基类,也不关心与什么类一起使用,而是在运行时动态的同其他零散的类一起组合使用。
使用mixin机制有如下好处:可以在不修改任何源代码的情况下,对已有类进行扩展;可以保证组件的划分;可以根据需要,使用已有的功能进行组合,来实现"新"类;很好的避免了类继承的局限性,因为新的业务需要可能就需要创建新的子类。
现在也基本上不写视图函数了,项目上能见到的也就是 等几个函数了,不过现在也要改成视图类形式了。
是否启用admin
虽然admin是Django的主要优势所在,但是它的使用场景有限,主要由于整合许多功能,比如分页、过滤、搜索、增删改查和批量操作等等,相互之间具有非常高的耦合度。在没有提供公开的API下去实现一些定制往往是"牵一发而动全身",最后基本上也改的是不成样子。
由于项目中没有使用内置的admin组件,增删改查的页面就需要多花一点时间自己去适配。
日志模型也要自己去设计,项目中我自己添加了ip这个字段,这个是原来所没有的。
后端数据API - DRF
后端数据采用的是 Django Rest Framework 这个框架,覆盖了大多数需求,包括:
搜索/分页
访问权限
请求限制(频率、IP)
表单验证
前端 Amaze UI
前端UI用的是 Amaze UI这个框架。不过从后来的发展形势来看,这是最为错误的决定了,主要原因在于无法和后端比较平稳地整合。
Django表单中有一个比较大的问题,如何需要定制控件样式,需要在Python代码中修改,而且需要应用的每一处都需要更改,灵活度不够。目前主要有两种解决方式:
使用Django1.11版本的模板功能,这个功能刚刚推出,文档也只有一页的内容,不太建议使用。
使用 django-crispy-forms 第三方库,这个库的思路也是使用模板html文件渲染控件,已经有一定的使用规模,但是支持 Bootstrap这样常见的UI框架,不支持 Amaze UI。
导入导出
实现导入导出功能主要使用的是 tablib 和 django-import-export 这两个库,其中后者依赖前者。
导出
编写 , 几点值得注意的地方:
需要设置表头,不仅需要指定字段 ,同时也要显示指定 的值,通常和 一样即可。
里的元素必须是模型的数据库字段,不能是自定义的 property,这一点和 不一样。
可以使用 函数重写导出内容
class BillResource(resources.ModelResource):
领取专属 10元无门槛券
私享最新 技术干货