Python基础与Linux数据库。这是Python的入门阶段,也是帮助零基础学员打好基础非常重要的阶段。你需要掌握Python基本语法规则及变量、逻辑控制、内置数据结构、文件操作、高级函数、模块、常用标准库模块、函数、异常处理、MySQL使用、协程等知识点。
WEB全栈。这一部分主要学习Web前端相关技术,你需要掌握HTML、CSS、JavaScript、jQuery、BootStrap、Web开发基础、VUE、Flask Views、Flask模板、 数据库操作、Flask配置等知识。
数据分析+人工智能。这部分主要是学习爬虫相关的知识点,你需要掌握数据抓取、数据提取、数据存储、爬虫并发、动态网页抓取、scrapy框架、分布式爬虫、爬虫攻防、数据结构、算法等知识。
高级进阶。这是Python高级知识点,你需要学习项目开发流程、部署、高并发、性能调优、Go语言基础、区块链入门等内容。
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机制有如下好处:可以在不修改任何源代码的情况下,对已有类进行扩展;可以保证组件的划分;可以根据需要,使用已有的功能进行组合,来实现'新'类;很好的避免了类继承的局限性,因为新的业务需要可能就需要创建新的子类。
现在也基本上不写视图函数了,项目上能见到的也就是 django.contrib.auth.login 等几个函数了,不过现在也要改成视图类形式了。
是否启用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 这两个库,其中后者依赖前者。
导出
编写 Resource, 几点值得注意的地方:需要设置表头,不仅需要指定字段 Meta.fields,同时也要显示指定 Meta.export_order的值,通常和 Meta.fields一样即可。
Meta.fields 里的元素必须是模型的数据库字段,不能是自定义的 property,这一点和 ModelAdmin.list_display 不一样。
可以使用 dehydrate_FOO 函数重写导出内容
class BillResource(resources.ModelResource):defget_export_headers(self):
return['流水号','月份','类型','单价','用量','金额']
defdehydrate_price(self,obj):