目录
第 1 章 - 第 7 章学习实践记录请参见: 《Flask Web 开发——基于 Python 的 Web 应用开发实践》一字一句上机实践(上)
本文记录自己学习《Flask web 开发——基于 Python 的 Web 应用开发实践》的第 8 章 - 第 14 章内容。相比于刚开始学习第 1-7 章内容来说,本部分内容实战性更强,而且在书本上遇到的问题也相对较少,如果认真弄懂前 7 章内容的话,本部分内容相当于是对前 7 章内容的具体实践,学习也很轻松。
首先说明一下本部分项目示例实现了哪些功能?
下图中所示为一个管理员角色登陆系统各部分功能图片动态图:
我自己上机演练代码 :(PS:和 作者 GitHub 上代码 有些许区别)
1. 书本 79 页密码散列功能 shell 测试有 bug
如果学完第 7 章,并按照 71 页 manage.py 中写入启动脚本代码,在控制台输入 python manage.py shell 会报以下错误:TypeError: <flask_script.commands.Shell object at 0x0000000004E29668>: 'dict' object is not callable
解决办法如下图:
紧接着,如果还是安装书本上命令提示输入命令,会报以下错误:Traceback (most recent call last):File "<console>", line 1, in <module>
解决办法见下图:
2. 书本 87 页用 shell 插入新用户数据有 bug
本问题在于数据库设计含有外键,直接按照书中插入代码,未插入用户角色外键,是无法插入数据的。
解决办法:删除 User 表和 Role 表之间的多对一关系
然后,删除项目中所有 **.sqlite 文件和 migrations 文件夹,具体如下:
然后按照下图所示三步,重新创建数据库(PS:此处方法见第 5 章 5.11 节):
这些处理完毕后,依照书上插入代码,依旧会报找不到 User 和 db 错误,解决办法如下:
完成以上数据插入任务后,在 CMD 控制台输入 python manage.py runserver 开启服务,浏览器中输入 http://127.0.0.1:5000/auth/login,然后用插入的邮箱号和密码进行登陆,会得到如下结果:
3. 书本 89 页实际运行结果(PS:经验证,数据可以注册成功)
4. 书本 92 页执行一个新的数据库迁移
在 CMD 窗口中,依次输入 python manage.py db migrate -m "the second migration"、python manage.py db upgrade 命令,具体执行以及得到结果如下:
5. 书本 94 页示例 8-22 代码因为 Flask-Login 版本问题出现如下图所示 bug
解决办法见下图:
让我疑惑的是,我写笔记时看的是实体书,上面代码有问题,下面截图的是电子书,上面却是正确的 >~<,具体如下:
问题解决方案网址( https://segmentfault.com/q/1010000004041497 )
测试 is_authenticated 方法如下:
附加书本 95 页页面运行结果:
出现上图的原因:
花了一个多小时找错,结果发现是自己照着书本 83 页敲示例 8-8 代码时少了 return 语句,直接写 User.query.get(int(user_id)),具体如下:
解决来源( https://github.com/maxcountryman/flask-login/issues/302 ):
运行成功界面如下:
下面是我自己修改数据库数据中邮箱验证属性为 True 时显示结果(PS:主要在于邮箱验证时需要申请临时密码,所以就没填写具体邮箱数据,直接手动改写后台数据库中数据):
注:第 8 章主要讲解了如何使用 Flask 框架实现用户登陆、注册功能,以及使用邮箱进行用户注册确认以及密码修改确认等。感觉第 8 章内容就是对书本前 7 章内容的一次综合练习,所有使用的技术点都可以在前 7 章中找到。所以,个人感觉只要踏实把第 8 章所有代码以及实现思路弄懂,才算是刚刚入门 Flask 框架。
1. 书本 99 页使用 shell 会话把角色写入数据库问题
由于在第 8 章实现过程中,我把 Role 表和 User 表之间的外键关系给删除了,如果在这章不重新回复两表之间的关系就无法实现用户角色的功能。所以,在这种情况下,我又得要把数据库重新初始化、迁移和创建。之所以这么做,而不是直接进行迁移和创建,是因为我在直接进行迁移和创建的过程中,报错:default 属性在框架中已经存在,无法创建新的 Role 表,这个错误没有解决,由于初学,无奈,直接删除 migrations 文件夹和生成的 data-dev.sqlite 数据库文件,重新进行初始化、迁移和创建,发现一切 OK。具体如下:
好了,既然 Role 表和 User 表之间有了一对多而存在的外键关系,那注册功能插入用户数据时,必须得要确认用户角色,否则无法插入。
刚刚进行了注册测试,竟然不用确定用户角色,也可以插入成功。这样的感觉违背了我学习数据库的理论知识啊,之前第 5 章,进行插入数据时,行不通,现在好了。估计是之前学习时,代码有点 bug。
注:本章相当于主要在讲数据库的知识,和本书核心 Flask 框架的知识点联系不大,其中核心思想就是定义权限来分配角色等级。一个用户有的只有一种权限,有的可以有多种权限。权限的分配很灵活,这样处理操作大大简化了数据库的设计难度,也提高了数据的条理性。
1. 书本 105 页、107、109 页和 112 页操作运行结果
此处按照书本上的代码讲解,进行编写代码操作,其中遇到的问题在前面均已遇到过,所以到了此处基本没啥难点。按照书本讲解,运行结果具体如下:
用户简介页面
普通用户修改个人信息界面
管理员修改个人信息界面
显示用户头像的资料页面
注:本章主要实现博客系统普通用户和管理员角色的个人信息编辑功能实现,此处实现没有什么技术亮点和难点,只要认真完成书本前述部分,这部分功能完全没有障碍。
1. 有关书本 119 页示例 11-8 代码
本部分代码在作者 GitHub 上没有示例代码,即如果要实现导入虚拟数据测试功能,只能自己一个代码一个代码敲。不过,这个也太多了点,一个字母出错就要改错 >~<。从作者 GitHub 上直接克隆下来的代码,虽然没有示例代码,但是应该是作者更新代码后,在此处换了另一种实现方式,因为在项目文件中出现了一个新的 fake.py 文件,该文件中代码和示例 11-8 代码基本类似。
2. 书本 117 页、123 页、125 页和 130 页操作运行结果
注:本章是对博客系统功能的扩展,主要实现用户编辑发送博客文章,其中还可以使用 MarkDown 来实现对文章的编辑。功能具体实现参照书本的代码讲解即可,基本不会遇到什么较难的问题。
1. 书本 137 页和 142 页实际运行结果
2. 操作完第 12 章代码后,如果选择用户退出,可能会出现以下 bug:AttributeError: 'AnonymousUser' object has no attribute 'followed_posts'
解决办法,在 models.py 文件中找到 AnonymousUser 类,在这个类中添加一个方法,具体代码如下:
- @property
- def followed_posts(self):
- return Post.query.join(Follow, Follow.followed_id == Post.author_id) \
- .filter(Follow.follower_id == None)
注:本章具体实现部分的难点是关注用户记录的数据库表的设计,即多对对关系会生成一张中间表。其它部分,按照书本上的代码来上机操作,基本不会遇到什么难点。
1. 书本 148 页和 151 页实际上机运行结果
注: 本章主要实现博客的用户评论功能,以及添加了一个协管员权限,具体实现没有什么难点,按照书本的代码上机操作即可。
1. 书本 168 页测试打印结果
此处具体操作需要先在 CMD 中打开服务,才能获取 api 中数据。(PS:推荐一篇博客: http://blog.csdn.net/huang5487378/article/details/60778293 )
运行结果:
来源: http://www.cnblogs.com/liuzhen1995/p/8035393.html