Python3.5+Mongodb+Flask Web实战坑点小结【Dog Plus】

Python3.5+Mongodb+Flask Web实战坑点小结【Dog Plus】

我不是程序员,也不是设计师,我只是碰巧有一些想法和一台电脑。
I am not a designer nor a coder. I'm just a guy with a point-of-view and a computer.

写在前言前:

第一个WEB部署完毕,觉得有必要做一个小结:

开发平台及工具:Win10+Pycharm+Py3.5+Flask+Mongodb

回头看看,一旦选择这样的套装就注定要有很多坑来填。建议后来者能用Linux就别用Win系。

接下来我根据目录想到那写哪,以【注】的形式标示,随便搜一下,你都可以下载到该书的电子版和源代码。


  第一部分 Flask简介
  第1章 安装 3
  1.1 使用虚拟环境 4

【注】不管在开发环境还是生产环境,虚拟环境一定要配置好,除非你打算就只用Python开发一个项目WEB,将各种包混装在一起,也方便包与包之间相互打招呼。

  1.2 使用pip安装Python包 6

【注】Requirement.txt包含各个包的版本信息,部署的时候最好和开发的时候一致,当然Python的版本更应该如此。不然,也许突然就会遇到一个未知的BUG,让你抓狂。


  第2章 程序的基本结构 7
  2.1 初始化 7
  2.2 路由和视图函数 7
  2.3 启动服务器 9
  2.4 一个完整的程序 9
  2.5 请求-响应循环 11

【注】该节放在这里让初学者很容易忽视掉,尤其是对于请求上下问的理解。整个Flask撸码的过程就是围绕着参数传递,在理解这一节的时候一定要记得Python万法皆对象,会爆出很多淫荡的参数传递方法。

  2.5.1 程序和请求上下文 11
  2.5.2 请求调度 13
  2.5.3 请求钩子 13
  2.5.4 响应 14
  2.6 Flask扩展 15
  第3章 模板 19
  3.1 Jinja2模板引擎 19

【注】Jinja2作为模版的核心,控制结构的用法基本和Python相同,但是要注意灵活运用通道,在模版处理参数,传递参数(Url_for、Request.endpoint)。jinja在读取字典和列表的时候和Python略有差异。

  3.1.1 渲染模板 20
  3.1.2 变量 21
  3.1.3 控制结构 22
  3.2 使用Flask-Bootstrap集成Twitter Bootstrap 23

【注】我自己使用菜鸟教程中的Bootstrap,最好先看看别人的模版组成,了解container、rows、col,以及一些标签的用法。CSS和JS简单看一点就行,遇到再解决,时刻记得我们有搜索引擎,相信别人比自己聪明。

  3.3 自定义错误页面 26
  3.4 链接 29
  3.5 静态文件 29
  3.6 使用Flask-Moment本地化日期和时间 30
  第4章 Web表单 33

【注】该章整体偏单薄,前后台的交互很多时候就是以表单的形式来展现,缺陷在于多个表单请求、个性化表单的设置,以及表单提交之后不重定向会产生什么后果,都没有表述清楚。@李辉

4.1 跨站请求伪造保护 33
  4.2 表单类 34
  4.3 把表单渲染成HTML 35
  4.4 在视图函数中处理表单 37
  4.5 重定向和用户会话 39
  4.6 Flash消息 41
  第5章 数据库 43

【注】一开始准备用SQL,也用它实现了注册,由于最终的目标是数据分析,怎么能少了MongoDB,灵活添加数据,地理位置信息处理,和Pandas的基情。当花大力气学习Mongo的时候,却不知道后面有一个大坑在等着,差点让我放弃WEB采用Mongo初衷。

  5.1 SQL数据库 43
  5.2 NoSQL数据库 44
  5.3 使用SQL还是NoSQL 45
  5.4 Python数据库框架 45
  5.5 使用Flask-SQLAlchemy管理数据库 46
  5.6 定义模型 47
  5.7 关系 49
  5.8 数据库操作 50
  5.8.1 创建表 50
  5.8.2 插入行 51
  5.8.3 修改行 52
  5.8.4 删除行 52
  5.8.5 查询行 52
  5.9 在视图函数中操作数据库 54
  5.10 集成Python shell 56
  5.11 使用Flask-Migrate实现数据库迁移 56
  5.11.1 创建迁移仓库 57
  5.11.2 创建迁移脚本 57
  5.11.3 更新数据库 58
  第6章 电子邮件 59

【注】该节完全可以拿来使用,亮点在于异步(多线程)处理上,当初学爬虫的时候,这个多线程、多进程、进程池卡了很久才一知半解。其实在这里还有一个Idea拿出来分享,有兴趣的可以操作:免费邮箱分享,根据会员当日可提供有用邮箱发送数量作为会员的积分,积分可以用来兑换相应数量的邮件发送量,这样就可以实现大量邮件免费群发的目的。

  6.1使用Flask-Mail提供电子邮件支持 59
  6.2在Python shell中发送电子邮件 60
  6.3在程序中集成发送电子邮件功能 61
  6.4异步发送电子邮件 62
  第7章 大型程序的结构 65
  7.1 项目结构 65
  7.2 配置选项 66
  7.3 程序包 67
  7.3.1 使用程序工厂函数 68
  7.3.2 在蓝本中实现程序功能 69

【注】蓝本类似我们土木界的蓝图,不同单体建筑采用不同的图纸,不同功能的区域采用不同的图纸,修建到那个阶段用那个阶段的图纸,还可以边设计边施工。直白点就是把WEB网站功能容器化。细想Grid、Container、Blueprint、Class、Function、Docker都有相通之处。

  7.4 启动脚本 71
  7.5 需求文件 71
  7.6 单元测试 72
  7.7 创建数据库 74

【注】Mongodb的优势就在这里体验,不用预定义数据类型,想到的时候再加入,当然这一点再部署的时候可能出现让人困惑的错误。因此,即便用Mongodb的时候也尽可能按SQL的规范化预定义数据及类型,其次insert的速度要比update快很多。

  第二部分 实例:社交博客程序
  第8章 用户认证 77
  8.1 Flask的认证扩展 77
  8.2 密码安全性 77
  8.3 创建认证蓝本 80
  8.4 使用Flask-Login认证用户 81

【注】采用Mongodb最大的痛在这里,因为Flask-Login并没有支持非关系型数据库,对于初学者来说,要先理解这货的实现过程,也是一个痛苦的事情。好在有一篇中文和英文的参考文章可以借鉴。自行搜索Flask Mongodb。在这里停止了半个月的进程,说多了都是泪。

  8.4.1 准备用于登录的用户模型 81
  8.4.2 保护路由 83
  8.4.3 添加登录表单 83
  8.4.4 登入用户 84
  8.4.5 登出用户 86
  8.4.6 测试登录 86
  8.5 注册新用户 87
  8.5.1 添加用户注册表单 87
  8.5.2 注册新用户 89
  8.6 确认账户 90
  8.6.1 使用itsdangerous生成确认令牌 90

【注】这是一个很有用的东西,用来理解和实现Token很有帮助,甚至可以隐藏一些地址,或者限制地址的有效访问时间,可以间接的阻挡低级爬虫。道高一尺魔高一丈,其实一但用了selenium或无头浏览器,爬一个网站也就是效率的问题,几乎没有爬不到的数据,只有爬不到虫。

  8.6.2 发送确认邮件 92
  8.7 管理账户 95
  第9章 用户角色 97
  9.1 角色在数据库中的表示 97
  9.2 赋予角色 99
  9.3 角色验证 100

【注】直接在数据库中定义role,然后在相应的功能区域进行鉴权操作。麻烦了点,但是灵活,灵活不就是Flask的精髓嘛,要不去学Django

  第10章 用户资料 103
  10.1 资料信息 103
  10.2 用户资料页面 104
  10.3 资料编辑器 106
  10.3.1 用户级别的资料编辑器  106
  10.3.2 管理员级别的资料编辑器 108
  10.4 用户头像 110

【注】当采用SSLify时候,注意图像显示、邮箱验证的时候要分别处理http和https两种情况。

  第11章 博客文章 115
  11.1 提交和显示博客文章 115
  11.2 在资料页中显示博客文章 118
  11.3 分页显示长博客文章列表 118
  11.3.1 创建虚拟博客文章数据 119
  11.3.2 在页面中渲染数据 120
  11.3.3 添加分页导航 121

【注】又是一个让Mongodb初级用户恼火的地方,好在mongo有Skip函数可以有效处理分页。同样和表单提交一样,如何在一个页面内实现两个分页导航,就需要分析分页导航的代码,然后再手动实现,另,结合个着bootstrap进行理解,可能会更快一些。
  11.4 使用Markdown和Flask-PageDown支持富文本文章 124
  11.4.1 使用Flask-PageDown 124
  11.4.2 在服务器上处理富文本 125

【注】我没有用该文本编辑器,用的tinymce,可惜math模块没有配置成功,略带遗憾。谁能教教我用试用我乎的G编辑器的方法?

  11.5 博客文章的固定链接 127
  11.6 博客文章编辑器 128
  第12章 关注者 131

【注】Mongdb的优势就是随时插入使用者关系,用到的时候再find,可能速度上会逊色一点(ms),何况速度对我们并不重要,呵呵。

  12.1 再论数据库关系 131
  12.1.1 多对多关系 131
  12.1.2 自引用关系 133
  12.1.3 高级多对多关系 134
  12.2 在资料页中显示关注者 136
  12.3 使用数据库联结查询所关注用户的文章 138
  12.4 在首页显示所关注用户的文章 141
  第13章 用户评论 145
  13.1 评论在数据库中的表示 145
  13.2 提交和显示评论 146
  13.3 管理评论 149
  第14章 应用编程接口 153

【注】由于我的网站暂时不需要API借口,等需要和微信、支付勾搭的时候再看相关认证。

  14.1 REST简介 153
  14.1.1 资源就是一切 154
  14.1.2 请求方法 154
  14.1.3 请求和响应主体 155
  14.1.4 版本 156
  14.2 使用Flask提供REST Web服务 156
  14.2.1 创建API蓝本 157
  14.2.2 错误处理 157
  14.2.3 使用Flask-HTTPAuth认证用户 159
  14.2.4 基于令牌的认证 161
  14.2.5 资源和JSON的序列化转换 162
  14.2.6 实现资源端点 165
  14.2.7 分页大型资源集合 167
  14.2.8 使用HTTPie测试Web服务 168
  第三部分 成功在望
  第15章 测试 173

【注】整个视图层的代码加起来三千行,按部就班测试也就几秒,也想知道值得测试吗?

  15.1 获取代码覆盖报告 173
  15.2 Flask测试客户端 176
  15.2.1 测试Web程序 176
  15.2.2 测试Web服务 179
  15.3 使用Selenium进行端到端测试 180
  15.4 值得测试吗 184
  第16章 性能 185
  16.1 记录影响性能的缓慢数据库查询 185

【注】Mongodb试用的时候就尽可能一次调用,多次使用。但是在某些特定的环境下,游标只能使用一次,然后就失效了,就需要重新定义。

  16.2 分析源码 187
  第17章 部署 189
  17.1 部署流程 189
  17.2 把生产环境中的错误写入日志 190
  17.3 云部署 191

【注】我用Centos7.2,二马之一的,稍后会专门写写部署,在win平台之下文件夹的大小写、甚至空格是会被系统处理的,但是Linux太严谨,甚至某一些路径中不能包含中文,哥华丽的用拼音了。在我的网站中英文和拼音的混搭也成了时尚,擦!

对了,用gunicorn你不会后悔,至于进程守护,还没有找到很好的方法,有谁知道Centos7.2+Python3.5.2用什么守护神?求教!

  17.4 Heroku平台 191
  17.4.1 准备程序 192
  17.4.2 使用Foreman进行测试 196
  17.4.3 使用Flask-SSLify启用安全HTTP 197
  17.4.4 执行git push命令部署 198
  17.4.5 查看日志 199
  17.4.6 部署一次升级 199
  17.5 传统的托管 200
  17.5.1 架设服务器 200
  17.5.2 导入环境变量 200
  17.5.3 配置日志 201
  第18章 其他资源 203
  18.1 使用集成开发环境 203
  18.2 查找Flask扩展 204
  18.3 参与Flask开发 204

嘿嘿,随便写写,具体的坑在我的小站内已经有相关的资料,接下来朝着数据分析进军,pandas、scikit-learn,plotly我又回来了!

(一)2016年终小结之Python学习

(二)Python3.5+Mongodb+Flask Web实战坑点小结【Dog Plus】

(三)CentOS7.2+Python3.5+Flask部署标准化配置流程

(四)CentOS+MongoDB V3.4.0 安装

编辑于 2016-12-26

文章被以下专栏收录