From 157a8147d565ad79f45bc0c4213311dae2c28ae9 Mon Sep 17 00:00:00 2001 From: Kepler <870131615@qq.com> Date: Sun, 8 Sep 2019 17:18:46 +0800 Subject: [PATCH] backup20190908 --- doc/how.md | 30 ---- Readme.md => doc/note.md | 142 +++++++++++++----- ...2b5037_init_db.py => 80202255b813_init.py} | 10 +- .../versions/8ac5e793eba6_read_count.py | 28 ---- run.py | 3 +- 5 files changed, 116 insertions(+), 97 deletions(-) delete mode 100644 doc/how.md rename Readme.md => doc/note.md (77%) rename migrations/versions/{179fdc2b5037_init_db.py => 80202255b813_init.py} (94%) delete mode 100644 migrations/versions/8ac5e793eba6_read_count.py diff --git a/doc/how.md b/doc/how.md deleted file mode 100644 index 9d313a0..0000000 --- a/doc/how.md +++ /dev/null @@ -1,30 +0,0 @@ -* 初始化 -``` -python manager.py db init -# 最后出现...before proceeding为成功 -``` - -* 创建迁移脚本 -``` -python manager.py db migrate -m "init" -# 最后出现...done为成功 -``` - -* 部署 -``` -python manager.py deploy -``` - -* 创建管理员 -``` -python manager create_user -``` - -* 生成fake数据 -``` -python manager fake -> python manger postfake (userfake\commentfake\categoryfake) -``` - -* - diff --git a/Readme.md b/doc/note.md similarity index 77% rename from Readme.md rename to doc/note.md index 650f3b0..24242b1 100644 --- a/Readme.md +++ b/doc/note.md @@ -1,45 +1,98 @@ -[TOC] +- [1 结构](#1-结构) + - [1.1 run.py](#11-runpy) + - [1.2 requestments](#12-requestments) + - [1.3 config.py](#13-configpy) + - [1.4 instance/config.py](#14-instanceconfigpy) + - [1.5 app/**init**.py](#15-appinitpy) + - [1.6 app/views.app](#16-appviewsapp) + - [1.7 app/models.py](#17-appmodelspy) + - [1.8 app/static](#18-appstatic) + - [1.9 manage.py](#19-managepy) +- [2 csrf](#2-csrf) +- [3 请求上下文](#3-请求上下文) +- [4 WTF](#4-wtf) +- [5 数据库](#5-数据库) + - [5.1 mysql 数据库](#51-mysql-数据库) + - [5.2 数据库事件](#52-数据库事件) + - [5.3 Flask-migrate](#53-flask-migrate) + - [5.4 sqlalchemy 增删查改,错误](#54-sqlalchemy-增删查改错误) + - [5.5 点击标签显示该标签对应的文章](#55-点击标签显示该标签对应的文章) + - [5.6](#56) + - [5.6 密码散列](#56-密码散列) + - [5.6 SUMMERY](#56-summery) +- [6 蓝图](#6-蓝图) + - [6.1 端点 endpoint](#61-端点-endpoint) + - [6.2 全程](#62-全程) +- [7 发送确认邮件](#7-发送确认邮件) + - [7.1 app/email.py](#71-appemailpy) + - [7.2 发送确认邮件](#72-发送确认邮件) + - [7.3 什么?令牌](#73-什么令牌) + - [7.4 sqlalchemy 是自动提交的](#74-sqlalchemy-是自动提交的) +- [8 Flask-Login](#8-flask-login) + - [8.1 我的时间](#81-我的时间) +- [9 帖子和评论](#9-帖子和评论) + - [9.1 how](#91-how) + - [9.2 markdown? 左右](#92-markdown-左右) + - [9.3 页面显示文章摘要啊,readmore](#93-页面显示文章摘要啊readmore) + - [9.4 分页](#94-分页) + - [9.5 由于展示帖子部分很多是一样的](#95-由于展示帖子部分很多是一样的) + - [9.6 右侧显示该标签下的文章数量, category/name 页面也显示侧栏](#96-右侧显示该标签下的文章数量-categoryname-页面也显示侧栏) +- [导航栏](#导航栏) + - [固定导航栏](#固定导航栏) +- [样式 Bootstrap](#样式-bootstrap) +- [本地化时间](#本地化时间) +- [时间轴](#时间轴) [博客测试地址](https://kepler.pythonanywhere.com) -# 1 结构 +# 1 结构 ## 1.1 run.py + 用于启动一个服务器,它从包获得应用副本并运行,不会在生产环境中用到。 ## 1.2 requestments + 你想啊,可能有的插件只在测试的时候才需要啊,所以不必要都加入到requestments中 可以新建dev.txt文档,加上-r requestments.txt就可以继承这个里面的插件了 用于列出应用所以来的所有python包,分为生产依赖、开发依赖 ## 1.3 config.py + 包含应用需要的大多数配置变量 ## 1.4 instance/config.py + 数据库配置等东西全放到里面 -## 1.5 app/__init__.py +## 1.5 app/**init**.py + 用于初始化应用并把所有其他的组件组合在一起 ## 1.6 app/views.app + 定义了路由 ## 1.7 app/models.py + 定义了应用的模型 ## 1.8 app/static + 网站静态文件 ## 1.9 manage.py + 外部脚本,通过shell来运行,用来测试吧 +# 2 csrf -# 2 csrf 扩站点请求保护 避免来自其他地方的post请求,需要标记post请求的来源,以免视图函数也去处理这些请求 所以,需要识别这些请求是当前服务器输出的ui页面的post请求,进行wsgi配置就行了 -# 3 请求上下文 +# 3 请求上下文 + request: 请求对象,封装在客户端发出的HTTP请求中的内容 https://my.oschina.net/lionets/blog/410973 @@ -48,25 +101,27 @@ g: 请求钩子? +# 4 WTF -# 4 WTF validate_* 可以自己定义Field 的校验,并且这个会自动被调用来进行校验 +# 5 数据库 + +[ORM 框架:SQLAlchemy](http://docs.sqlalchemy.org/en/latest/contents.html) -# 5 数据库 -[ORM框架:SQLAlchemy](http://docs.sqlalchemy.org/en/latest/contents.html) +## 5.1 mysql 数据库 -## 5.1 mysql数据库 pip install mysql-connector-python-rf RUI:mysql+mysqlconnector://username:password@server/db 不支持中文? - ## 5.2 数据库事件 + 触发器:操作表的时候触发一些事件 事件:可以这样啊,每次插入用户都默认初始化他的role_id为guests ## 5.3 Flask-migrate + 需要注意:也要放入版本控制中 正常操作步骤跟着狗书走就对了 其实就是一个版本控制的作用,比如需要更新表结构,或者需要迁移到新机器上, @@ -78,22 +133,23 @@ > 2. 提示我某张数据表已经存在? why? 最后我删掉了数据库里的表和migration文件夹,按照狗书重新来了一遍就好了 -## 5.4 sqlalchemy增删查改,错误 -* sqlalchemy.exc.invalidRequestError这什么鬼错误,到处搜不到[答案](https://segmentfault.com/q/1010000005080603) +## 5.4 sqlalchemy 增删查改,错误 + +- sqlalchemy.exc.invalidRequestError 这什么鬼错误,到处搜不到[答案](https://segmentfault.com/q/1010000005080603) + +## 5.5 点击标签显示该标签对应的文章 -## 5.5 点击标签显示该标签对应的文章 正文的话只要显示post.category.name就可以了,然后做个连接url_for到视图 接下来点击标签就是访问那个视图,然后就。。 -TODO - 很简单啊,在index.html里显示了当前post的标签了,所以点击的话就连接到category/就可以了; - 然后这个category视图把查到的posts返回去显示出来就可以了,这里我又写了个html,我感觉是不是可以复用一下index↓ + 很简单啊,在 index.html 里显示了当前 post 的标签了,所以点击的话就连接到 category/就可以了; +然后这个 category 视图把查到的 posts 返回去显示出来就可以了,这里我又写了个 html,我感觉是不是可以复用一下 index↓ - ```select category.id, category.name, posts.title from posts, categorys where(posts.category_id = category.id);``` + ```select category.id, category.name, posts.title from posts, categorys where(posts.category_id = category.id);``` 以上的多表查询有问题 应该在最后加上````and category.id=2```` 这样的多表查询语句用sqlalchemy怎么写? > posts = db.session.query(Post).join(Category) - 我是想用上面这种多表查询的方法来查询某tagname下的文章的,sql语句会写, 但是sqlalchemy怎么写就不懂 + 我是想用上面这种多表查询的方法来查询某tagname下的文章的,sql语句会写, 但是sqlalchemy怎么写就不懂 后来看人家的源码知道, 在写模型的时候, 表A的外键所链接的表B, 模型里backref参数的,我当时以为只是给外键所在的表A一个参数以便它 来访问这个表B, 谁知道B也可以用参数去访问A,这样太方便了好吗,我不需要给B表新添字段让他去参照A,或者写个多表查询的语句了 @@ -103,12 +159,12 @@ TODO 还有,难道真的要添加个count字段?我想在视图里query出来,然后传过去 - - ## 5.6 + http://blog.csdn.net/huoyuan_zh/article/details/7322160 ## 5.6 密码散列 + werkzeug库的security可以进行散列密码的计算, generate_password_hash(passwd, method...)方法计算原始密码的散列值 check_password_hash(hash,passed)方法检查给出的hash密码与明文密码是否相符 @@ -116,18 +172,21 @@ TODO 验证登录的时候看一下form.email.data对应的check_password_hash是不是True就可以了 ## 5.6 SUMMERY + 主要还是要建好表的映射,当然还有数据库事件触发器、seed、staticmethod这些也要懂 +# 6 蓝图 -# 6 蓝图 蓝图就像app里的模块,将不同的功能划分到不同的蓝图里,所以, 蓝图有自己独立的静态文件独立的views等文件 -## 6.1 端点endpoint +## 6.1 端点 endpoint + url_for():为了防止后期改动需要频繁更换url所以引入端点, 如url_for('auth.index', *argv)那么对应的端点就是blueprint.index, ## 6.2 全程 + 其实也简单,前面说蓝图就是将不同功能的划分到不同模块中,方便管理而已, 在没有使用蓝图之前只是采用了工厂方法,将初始化app的部分包装在函数里, 然后放到__init__.py里,这样app包下导入方便,把处理数据库的models独立出来, @@ -142,12 +201,14 @@ TODO 弄了好久,一直提示说找不到endpoint,原来是因为我用了nav插件做导航栏, 但是没将链接改为auth.index - # 7 发送确认邮件 + ## 7.1 app/email.py + 怎么使用falsk-email来发邮件?配置email.py的时候, 要注意导入上下文?顺便导入配置文件里的变量? ## 7.2 发送确认邮件 + 注册函数那里实例化User后,根据用户的id生成token,然后执行email函数发送一个带token的连接给用户, 用户点击这个确认链接后就会访问到'/confirm/'这个视图,这个视图调用models里的confirm函数对用户进行校验, 如果校验成功就把confirmed设置为1,我们可以根据这个值判断用户是否点击了确认邮件, @@ -155,51 +216,61 @@ TODO template那里的参数,我直接在里面写'/auth/email/'就会自动选取app/template/auth/...下的HTML了; ## 7.3 什么?令牌 + itsdangerous 注册或找回密码的时候需要发一个确认连接,这个链接肯定是加密的是唯一的,就叫做令牌吧token 如果点了我发过去的确认邮件,我就讲你的confirmed值设置为True token的过程是怎么样的? 看models里的注释吧,写得挺清楚的 -## 7.4 sqlalchemy是自动提交的 +## 7.4 sqlalchemy 是自动提交的 + 一切就绪了,注册完后也会发送确认邮件了,但是我点击了确认邮件,confirmed字段却没有被设置为1. 理论上,在config中设置了SQLALCHEMY_COMMIT_ON_TEARDOWN = True的话是会自动提交的, 也就是只要db.session.add(self)就行,不需要db.session.commit(),结果发现我单词写错了!!!!!!! - # 8 [Flask-Login](http://www.cnblogs.com/agmcs/p/4445428.html) -[flask-qq-weibo登录](http://www.cnblogs.com/GresonFrank/archive/2013/11/13/python.html) + +[flask-qq-weibo 登录](http://www.cnblogs.com/GresonFrank/archive/2013/11/13/python.html) 还是看官方文档好啊,至少说的明白清楚,搞清楚 继承UserMixin, login_request @login_manager.user_loader回调函数 -## 8.1 我的时间? +## 8.1 我的时间 + moment插件? 注册时间? 怎么实现上次登录时间? 就是登录就显示时间而已。 # 9 帖子和评论 -## 9.1 how? + +## 9.1 how + 很简单啦其实,一样,只是数据库操作啊,前面也定义好了表了; 一个posts和一个edit, template/posts页面 ## 9.2 markdown? 左右 + 就是那种啊,一边编辑,一般预览啊; 装了markdown插件,我还是不会写页面啊,尴尬,甚至连那些标签都不懂,,,, [那怎么做个编辑框啊?](https://segmentfault.com/q/1010000004406545) [editormd](http://blog.csdn.net/hj960511/article/details/53037618) -## 9.3 页面显示文章摘要啊,readmore? +## 9.3 页面显示文章摘要啊,readmore + https://segmentfault.com/q/1010000003496839 用jinja2的truncate过滤器过滤后在后面合适的位置添加'了解更多',其实只要添加这篇posts的链接就可以了 ## 9.4 分页 + /main/views.py pagination bootstrap支持分页,导入就可以 {% from "bootstrap/pagination.html" import render_pagination %} ## 9.5 由于展示帖子部分很多是一样的 + 我不可能每个页面都复制一大堆div啊什么的吧,所以我写了个宏,就是把原来index里展示帖子、右侧栏的部分剪切过去,传入posts、categorys参数就可以了 {% macro show_posts(posts, categorys) %} 然后在index.html 或category.html引入就可以了 {% from "./includes/_macros.html" import show_posts as onshow %} {{ onshow(posts, categorys) }} -## 9.6 右侧显示该标签下的文章数量, category/name页面也显示侧栏 +## 9.6 右侧显示该标签下的文章数量, category/name 页面也显示侧栏 + 我现在需要知道这个标签下有多少篇文章怎么办?难道在模型加上count字段?然后呢? 终于解决了!! @@ -218,8 +289,11 @@ TODO 我那时候也以为需要做多表查询(看5.5) # 导航栏 + 本来用的是flask-nav的,但是好像用的不太好,所以就copy了别人的导航栏_navbar.html,然后在base.html中引入 + ## 固定导航栏 +