《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(下)
目录
前言
第1章-第7章学习实践记录请参见:《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)
本文记录自己学习《Flask Web开发——基于Python的Web应用开发实践》的第8章-第14章内容。相比于刚开始学习第1-7章内容来说,本部分内容实战性更强,而且在书本上遇到的问题也相对较少,如果认真弄懂前7章内容的话,本部分内容相当于是对前7章内容的具体实践,学习也很轻松。
首先说明一下本部分项目示例实现了哪些功能?
- 用户角色:普通用户、管理员
- 具体功能:登陆、注册、发布文章、编辑文章、用户间关注、用户评论、修改个人信息、管理用户评论、MarkDown显示文章格式。
下图中所示为一个管理员角色登陆系统各部分功能图片动态图:
我自己上机演练代码:(PS:和作者GitHub上代码有些许区别)
第8章 用户认证
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框架。
第9章 用户角色
1.书本99页使用shell会话把角色写入数据库问题
由于在第8章实现过程中,我把Role表和User表之间的外键关系给删除了,如果在这章不重新回复两表之间的关系就无法实现用户角色的功能。所以,在这种情况下,我又得要把数据库重新初始化、迁移和创建。之所以这么做,而不是直接进行迁移和创建,是因为我在直接进行迁移和创建的过程中,报错:default属性在框架中已经存在,无法创建新的Role表,这个错误没有解决,由于初学,无奈,直接删除migrations文件夹和生成的data-dev.sqlite数据库文件,重新进行初始化、迁移和创建,发现一切OK。具体如下:
好了,既然Role表和User表之间有了一对多而存在的外键关系,那注册功能插入用户数据时,必须得要确认用户角色,否则无法插入。
刚刚进行了注册测试,竟然不用确定用户角色,也可以插入成功。这样的感觉违背了我学习数据库的理论知识啊,之前第5章,进行插入数据时,行不通,现在好了。估计是之前学习时,代码有点bug。
注:本章相当于主要在讲数据库的知识,和本书核心Flask框架的知识点联系不大,其中核心思想就是定义权限来分配角色等级。一个用户有的只有一种权限,有的可以有多种权限。权限的分配很灵活,这样处理操作大大简化了数据库的设计难度,也提高了数据的条理性。
第10章 用户资料
1.书本105页、107、109页和112页操作运行结果
此处按照书本上的代码讲解,进行编写代码操作,其中遇到的问题在前面均已遇到过,所以到了此处基本没啥难点。按照书本讲解,运行结果具体如下:
用户简介页面
普通用户修改个人信息界面
管理员修改个人信息界面
显示用户头像的资料页面
注:本章主要实现博客系统普通用户和管理员角色的个人信息编辑功能实现,此处实现没有什么技术亮点和难点,只要认真完成书本前述部分,这部分功能完全没有障碍。
第11章 博客文章
1.有关书本119页示例11-8代码
本部分代码在作者GitHub上没有示例代码,即如果要实现导入虚拟数据测试功能,只能自己一个代码一个代码敲。不过,这个也太多了点,一个字母出错就要改错>~<。从作者GitHub上直接克隆下来的代码,虽然没有示例代码,但是应该是作者更新代码后,在此处换了另一种实现方式,因为在项目文件中出现了一个新的fake.py文件,该文件中代码和示例11-8代码基本类似。
2.书本117页、123页、125页和130页操作运行结果
注:本章是对博客系统功能的扩展,主要实现用户编辑发送博客文章,其中还可以使用MarkDown来实现对文章的编辑。功能具体实现参照书本的代码讲解即可,基本不会遇到什么较难的问题。
第12章 关注者
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)
注:本章具体实现部分的难点是关注用户记录的数据库表的设计,即多对对关系会生成一张中间表。其它部分,按照书本上的代码来上机操作,基本不会遇到什么难点。
第13章 用户评论
1.书本148页和151页实际上机运行结果
注:本章主要实现博客的用户评论功能,以及添加了一个协管员权限,具体实现没有什么难点,按照书本的代码上机操作即可。
第14章 应用编程接口
1.书本168页测试打印结果
此处具体操作需要先在CMD中打开服务,才能获取api中数据。(PS:推荐一篇博客:http://blog.csdn.net/huang5487378/article/details/60778293)
运行结果: