读书笔记:《Flask Web Development》part 1
2015-01-02
主要是写给自己的读书笔记,便于日后快速回忆这个主题的内容,也希望能有幸影响到若干匆匆过客。
# meta
作者Miguel Grinberg有25年工作经验,在视频广播行业,博客覆盖web开发,机器人,摄影等领域,因此积累是足够的。国外的这些老程序员都是国内职业生涯的好样板。
全书分成三部分:
- 基础知识导论
- 一个完整的例子串讲
- 最后一公里的测试调优部署
或者更具体一些:
- basic
- templates, database, form, email support
- packages and modules
- auth, roles, profiles
- a blogging project
- restful api
- unit test, performance
- deploy
# preface
提供一个坚实的基础,然后接入一个第三方的生态,这是一种不同的策略或者说境界。
本书的结构是从零开始,逐渐扩展成一个成熟的项目,而不是零散的知识介绍,因此对入门应该是比较合适的。
# Installation
```
micro framework, lean stack
when familiar with it, can read all of its source code
```
这个框架只抓住web开发核心的要素,实现的很棒,其他通用的东西就交出去,这样的好处是可以集中精力做好擅长或核心的事情,同时又能借助社区的力量,毕竟持续进化的才是最优秀的。KISS原则。
实际操作时用vagrant代替了virtualenv。
# Basic Application Structure
- route and view function
- dynamic name component
- application and request context # context tricks实现不用每个view function都加参数,实际上是隐藏了参数
- request hooks # hook的好处是通用的代码不用每个地方都改
- response # 三种response
- flask-script # extension # 这里可以看出开放策略的好处了,封闭系统很难把每件事情做到极致,开放就可以持续的演化。
# Templates
- 代码应该尽可能的简单和整洁,尽可能的做拆分和独立。首先业务和展现应该区分开,因此用template来负责把展现的部分独立出来。
- 具体的编码是最简单的一步,设计清楚了,实现非常的简单,关键是结构要合理清晰。
- template engine jinjia2能做的事情非常多,有分支循环,能执行方法,能重用相当于定义函数,还能继承,相当于oo,已经是较完善的编程语言了。
- flask-bootstrap
- custom error pages
- links # get url by view function
- static files # favicon.ico
- flask-moment # 对moments.js的包装,使得可以在template里方便的调用moments.js的方法,最终实现在browser端格式化时间的功能,这个还是比较常用的。
# Web Forms
- 使用secret-key来做CSRF保护
- 敏感信息不能写在代码里,而是通过环境变量来注入
- 理论上用request的form字段就足够了,但不够高效,会有很多重复代码,本章来集中解决这方面的问题。
- 基本的表单类型和验证,在render方面,有bootstarp的wtf支持,可以wtf.quick_form()
- `This is a great example of the power that well-designed extensions like Flask-WTF and Flask-Bootstrap can give to your application.`
- 为了避免浏览器里刷新时的警告,每个post都要搭配redirect。
- request之间的状态传递,可以用user session实现,一个客户端的私有存储,实际上在cookie里。
- 数据变更时通过flash提供可能的提示, flask自带的功能。
form的各种问题,定义展示数据搜集与session存储,解决了CSRF保护及POST重定向等问题,必要时可以通过flash增加提示。
# Databases
- sql vs nosql
- nosql主要是为了解决sql需要做表join的问题,因此用冗余数据denormalization来减少表的数量,使得检索非常方便,但不利于做更改,不能做join操作。
- 优先使用一个高级别的抽象,比如ORM,如果有性能问题,再做具体的优化。
- ORM的好处是后期可以换数据库引擎,用中间层去除了依赖,随便找一个会用的就可以了,比如先sqlite,后续再迁移到mysql。
- sqlalchemy
- nb, database engine的选择直接配置一个字符串就ok了。
- orm居然能做建库和表创建,这样只要学习这个中间语言就足够了,早期不用关心各种数据库的细节,只了解通用的范式。
- CRUD实现的非常方便,回想GAE也是这样,可惜之前没有领悟到。
- database migration # 给了database cvs的能力
- 这里只是简单的介绍,实际用得时候还是要查对应的文档。
整体来看,SqlAlchemy抽象一个中间层出来,定义ORM就可以了,然后是CRUD,都非常简单。还是那句话,具体编码很容易,关键是设计的完整合理清晰。
# Email
- flask-mail提供了比python smtp库更好用的封装,同template engine结合在一起,使用非常方便和强大。
- 具体到生产环境,还是要找第三方的邮件发送服务来做具体的事情,需要用到队列。
# Large Application Structure
- organize a large application in packages and modules
- 提出了一种工程的组织方式
- dev, test, production三种环境独立配置,由env指定
- blueprint
- unittest
# 感受
整体印象是比较通俗易懂,循序渐进的讲解基于flask的web开发的要素,一步一步,把问题暴露或引导出来,然后拿出flask对应的解决方案,有顺流而下的感觉,比较喜欢这种写作风格。
精心准备的代码可以作为日后做实际项目很好的基础。
读完并跟着做完demo,基本概念就都了解了,看各种web页面的感觉马上就变了,有种剑在手踌躇满志的感觉,但总是心里没底。因此part 2作者给了一个完整的系统的构建过程,来扶上马送一程,应该会有帮助。
future update will publish at "http://nerdcai.com/blog/2015/01/02/flask-web-development-part-1/"