********************* flaskPractice项目规划 ********************* ============= version 1.7.1 ============= 1. 重构代码,去掉没用的部分 2. 增加logger 3. 增加异常处理等内容 4. 增加注释 5. 把以前做过的东西过一遍 ====================== version 1.7.1 项目总结 ====================== 2017-09-09 1. 对于整个系统增加了logger,但是最好是使用某种统一的解决方式去做,不然每个文件都定一个logger也是属于代码复制的范畴了 2. 简单重构了一下代码,对于token的解析采用一个简单的工具函数去做,对于日期的处理则使用一个混类去做,这个混类以后就用来写一些工具方法,views当中的诸多dict全部去掉了,规定好templates里面不得对传进去的对象进行修改,那么就可以直接使用查询对象 无需构建一个新的dict 3. 异常处理这部分对于深入业务逻辑的部分还没有去改 4. 大部分的内容的做了注释 =========== version 1.7 =========== 1. 增加关注功能 2. 显示所关注用户的文章 3. 显示我自己的文章 ==================== version 1.7 项目总结 ==================== 2017-08-31 1. 关注功能设计的一个核心知识点在于多对多关系的建立,由于多对多关系本身需要一些另外的字段如关系的创建时间去表示关系的状态,因此需要一个实体表去连接关系的双方,而非只是一个sqlalchemy层面的虚拟表(而对于虚拟表的工作方式我还要跟进一下),这也是所谓的高级多对多关系 2. 使用 ``lazy='joined'`` 可以自动加载引用的对象,对于lazy模式的设置在不同场景下是不一样的那个的,如果一个对象其对应的那个对象是唯一的话,那么lazy可以直接设置为joined,从而能够直接获取该对象本身,而如果这个对象对应的对象不是唯一的,会有多个话,那么lazy应当设置为dynamic,这样可以获取一个query,在后面插入更多的查询条件 3. 自动follow自己这个方法是有坑的,你不能直接使用self.follow(),会导致无法建立follow,因为user还没有建立获取不到外键的值。合适的方法是这样 .. code-block:: python def __init__(self, **kwargs): super().__init__(**kwargs) # 不能直接使用self.follow(),会导致无法建立follow,因为user还没有建立获取不到外键的值 self.followed.append(Follow(followed=self)) 4. 关于联结查询,基本上就是对于join方法的使用了,这个没什么太大难度,本质上就是联表查询了 5. 最后默认显示关注的人的还是所有人的blog,这牵涉到了cookie的种植,对于cookie种植可以采用make_response函数去做,最后再对返回的response进行封装。cookie在客户端的表示其实就相当于是一个字典,没有什么特别之处 =========== version 1.6 =========== 1. 使用forgerypy制造假数据 2. 完成博客文章的分页显示功能,一次最多显示20条最近的博客 3. 增加博客文章编辑的markdown支持 ==================== version 1.6 项目总结 ==================== 2017-08-28 1. 目前(2017-08-28)已经完成使用forgerypy制造假数据的部分,主要学到的内容在于: | (1)seed函数可以创建一个随机数种子,适用于接下来的代码中会用到随机的地方 | (2)使用db.session.rollback可以进行回滚,具体的涉及数据库事务的部分现在还不理解 | (3)engine后面的参数第一个表示偏移量,即从哪个开始取,第二个表示取值个数(应该是) 2. 博客的分页功能采用flask-sqlalchemy的paginate方法实现,其会创造一个Paginate对象,能从其中读取分页的页面数和当前分页的内容,用起来还是相当方便的,需要注意的一个点是模板宏的使用,这个东西写的时候默认支持关键字参数,不用加 ``**kwargs`` 3. markdown支持部分有几个重要的点需要说一下: | (1)使用flask-pagedown可以通过模板宏生成实时的markdown预览,对于这个原理不甚清楚 | (2)对于markdown的内容为了避免每次读取的时候渲染选择直接在数据库中存储html格式的内容,设定了一个监听程序 ``db.event.listen`` 可以在每次blog.body更新的时候自动更新对应的html内容。这个相当好用,需要学习一下。 | (3)jinja2默认会对动态生成的html语法的内容进行转移,为了使markdown的渲染可用,需要使用 ``| safe`` 取消转义 =========== version 1.5 =========== 1. 完成用户资料的显示模块 | (1)增加多个字段,包括注册时间、最近登录时间、自我介绍、真实姓名 | (2)通过用户昵称跳转至一个简单的用户个人资料页面 2. 完成用户资料的编辑模块 | (1)完成用户级别的个人资料编辑 | (2)完成管理员级别的个人资料编辑,能够编辑用户的电子邮件、用户名、确认状态和角色 ==================== version 1.5 项目总结 ==================== 2017-08-24 字段增加、跳转这些都没有什么问题,主要的难点还是在于管理员级别form类的构造上。一个点是应当通过data去填充form的默认值,而非通过placeholder属性,用后者的话会导致没有填写的数据提交消失,还有validate方法也好好学习了一下,还是非常强大的,不过这里的话自己踩了很多坑,比如没有把field参数传进去