Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog

目录

  • 目录
  • 前文列表
  • 实现所需要的视图函数
  • 实现 home.html 模板
  • 代码分析
  • 实现效果

前文列表

用 Flask 来写个轻博客 (1) — 创建项目
用 Flask 来写个轻博客 (2) — Hello World!
用 Flask 来写个轻博客 (3) — (M)VC_连接 MySQL 和 SQLAlchemy
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
用 Flask 来写个轻博客 (5) — (M)VC_SQLAlchemy 的 CRUD 详解
用 Flask 来写个轻博客 (6) — (M)VC_models 的关系(one to many)
用 Flask 来写个轻博客 (7) — (M)VC_models 的关系(many to many)
用 Flask 来写个轻博客 (8) — (M)VC_Alembic 管理数据库结构的升级和降级
用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览
用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法
用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板
用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验

实现所需要的视图函数

  • 在开始实现首页模板之前, 我们为了调试和显示的方便, 首先伪造一些假数据:

    • fake_data.py
import random
import datetime
from uuid import uuid4from models import db, User, Tag, Postuser = User(id=str(uuid4()), username='jmilkfan', password='fanguiju')
db.session.add(user)
db.session.commit()user = db.session.query(User).first()
tag_one = Tag(id=str(uuid4()), name='Python')
tag_two = Tag(id=str(uuid4()), name='Flask')
tag_three = Tag(id=str(uuid4()), name='SQLALchemy')
tag_four = Tag(id=str(uuid4()), name='JMilkFan')
tag_list = [tag_one, tag_two, tag_three, tag_four]s = "EXAMPLE TEXT"for i in xrange(100):new_post = Post(id=str(uuid4()), title="Post" + str(i))new_post.user = usernew_post.publish_date = datetime.datetime.now()new_post.text = snew_post.tags = random.sample(tag_list, random.randint(1, 3))db.session.add(new_post)db.session.commit()

直接在 manager shell 中导入就能够执行该脚本文件:

>>> import fake_data

home.html 的视图函数之前博文中就已经记录过了,现在再将必须的视图函数代码贴出。

  • views.py
from flask import render_template
from sqlalchemy import funcfrom main import app
from models import db, User, Post, Tag, Comment, posts_tagsdef sidebar_data():"""Set the sidebar function."""# Get post of recentrecent = db.session.query(Post).order_by(Post.publish_date.desc()).limit(5).all()# Get the tags and sort by count of posts.top_tags = db.session.query(Tag, func.count(posts_tags.c.post_id).label('total')).join(posts_tags).group_by(Tag).order_by('total DESC').limit(5).all()return recent, top_tags@app.route('/')
@app.route('/<int:page>')
def home(page=1):"""View function for home page"""posts = Post.query.order_by(Post.publish_date.desc()).paginate(page, 10)recent, top_tags = sidebar_data()return render_template('home.html',posts=posts,recent=recent,top_tags=top_tags)@app.route('/post/<string:post_id>')
def post(post_id):"""View function for post page"""post = Post.query.get_or_404(post_id)tags = post.tagscomments = post.comments.order_by(Comment.date.desc()).all()recent, top_tags = sidebar_data()return render_template('post.html',post=post,tags=tags,comments=comments,recent=recent,top_tags=top_tags)@app.route('/tag/<string:tag_name>')
def tag(tag_name):"""View function for tag page"""# Tag.qurey() 对象才有 first_or_404(),而 db.session.query(Model) 是没有的tag = Tag.query.filter_by(name=tag_name).first_or_404()posts = tag.posts.order_by(Post.publish_date.desc()).all()recent, top_tags = sidebar_data()return render_template('tag.html',tag=tag,posts=posts,recent=recent,top_tags=top_tags)

实现 home.html 模板

  • templates/home.html
<!-- Replace the TITLE of template base.html -->
{% extends "base.html"%}
{% block title %}JmilkFan's Blog{% endblock %}<!-- Replace the BODY of template base.html -->
{% block body %}
<!-- The data object from view function: `home()` -->
<div class="row"><div class="col-lg-9"><!-- Get Pagination object-->{% for post in posts.items %}<div class="row"><div class="col-lg-12"><h1>{{ post.title }}</h1></div></div><div class="row"><div class="col-lg-12">{{ post.text | truncate(255) | safe }}<!-- Set the link for read more --><a href="{{url_for('post', post_id=post.id)}}">Read More</a></div></div>{% endfor %}</div><div class="col-lg-3"><div class="row"><h5>Recent Posts</h5><ul>{% for post in recent %}<!-- Set the link for recent posts. --><li><a href="{{url_for('post', post_id=post.id)}}">{{ post.title }}</a></li>{% endfor %}</ul></div><div class="row"><h5>Popular Tags</h5><ul>{% for tag in top_tags %}<li><a href="{{url_for('tag', tag_name=tag[0].name)}}">{{ tag[0].name }}</a></li>{% endfor %}</ul></div></div><!-- Call the Macro: `render_pagination` from base.html -->{{ render_pagination(posts, 'home') }}
</div>
{% endblock %}

代码分析

需求:我们希望当访问到域名 http://<ipaddress>:5000/,即访问博客的 / 时,能够正文处显示文章列表,右上侧边栏显示最新的 5 篇博文,右下侧边拦显示 关联博文数最多的 5 个标签,并且希望每一个页面的右侧边栏都是一致的。

  • 按照这个需求,首先我们需要定义一个路由函数(在这里同时也是视图函数) home() 来跳转到首页,并且首页中具有分页的功能,所以会定义两个 app.oute() 装饰器。

  • 同时因为我们需要在右侧边栏显示最新的 5 篇博文和博文关联数最多的 5 个标签,所以需要提供 recent/recent 数据对象,并且这些对象是高重用的,所以将其抽象成一个函数。

  • 我们还希望能够通过右侧边拦提供的链接跳转到具体的 post 或 tag 中,这就需要得到 posts/tags 表中的数据对象,所以会使用到视图函数 post()/tag()

实现效果

  • 再结合在前面博文中实现的分页链接宏

用 Flask 来写个轻博客 (14) — M(V)C_实现项目首页的模板相关推荐

  1. 用 Flask 来写个轻博客 (12) — M(V)C_编写和继承 Jinja 模板

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 使用 Bootstrap 编写 Jinja 模板文件 继承一 ...

  2. 用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 实现 post() 视图函数 在 post.html 中添加表单 效果 ...

  3. 用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 视图函数 在 views.py 文件中定义视图函数 定义右侧边栏的视图 ...

  4. 用 Flask 来写个轻博客 (13) — M(V)C_WTForms 服务端表单检验

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 WTForms WTF 的基础使用 常用的字段类型 fields.Da ...

  5. 用 Flask 来写个轻博客 (10) — M(V)C_Jinja 常用过滤器与 Flask 特殊变量及方法

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 Jinja 中常用的过滤器 default float int len ...

  6. 用 Flask 来写个轻博客 (9) — M(V)C_Jinja 语法基础快速概览

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 扩展阅读 Jinja 变量名 注释 控制语句 if 语句 循环 过滤器 ...

  7. 用 Flask 来写个轻博客 (37) — 在 Github 上为第一阶段的版本打 Tag

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 第一阶段结语 打 Tag 前文列表 用 Flask 来写个轻博客 (1 ...

  8. 用 Flask 来写个轻博客 (36) — 使用 Flask-RESTful 来构建 RESTful API 之五

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 PUT 请求 DELETE 请求 测试 对一条已经存在的 posts ...

  9. 用 Flask 来写个轻博客 (35) — 使用 Flask-RESTful 来构建 RESTful API 之四

    Blog 项目源码:https://github.com/JmilkFan/JmilkFan-s-Blog 目录 目录 前文列表 POST 请求 身份认证 测试 前文列表 用 Flask 来写个轻博客 ...

最新文章

  1. 你们都是怎么学 Python 的?
  2. Lucene+Tika 文件索引的创建与搜索
  3. Flask 教程 第十八章:Heroku上的部署
  4. Ivan and Powers of Two CodeForces - 305C(set)
  5. Quartz2D知识点聚合案例
  6. 将所有文件从目录复制到Python中的另一个目录
  7. JavaFX 新WebService客户端脚本语言
  8. 经典面试题(19):以下代码将输出的结果是什么?
  9. html是什么1002无标题,Jsf页面为普通/无标题的文本html
  10. IP地址转化为32位无符号数
  11. PHP设计模式——访问者模式
  12. 计算机科学与技术_080702,电子科学与技术(专业代码;080702)专业介绍与解读
  13. 如何将html转换成url,HTML URL
  14. 公共管理和社会保障、旅游1994-2019年省级面板数据数据
  15. Reflection(反射)
  16. 《Cocos Creator游戏实战》你画我猜中的画板功能
  17. 斗地主的Java实现
  18. (三)Window自带计算器实现换算、运算:快速科学计算、单位换算、二进制十六进制转换与运算、货币换算、长度换算等等
  19. SourceInsight 豆沙绿背景颜色
  20. 四种简单的图像显著性区域特征提取方法-----AC/HC/LC/FT。

热门文章

  1. 河北师范大学C语言试题,2017年河北师范大学信息技术学院838C语言程序设计考研题库...
  2. linux 运行lua脚本语言,你知道在linux下搭建lua脚本语言的编程环境?
  3. java任何封闭实例都不是java_《java并发编程实战》读书笔记3--对象的组合
  4. mysql 避免使用临时表_从日期范围中选择时防止MySQL使用临时表
  5. ubuntu eclipse mysql_Ubuntu设置、应用及常见问题解决(十)- 安装jdk+tomcat+eclipse+mysql...
  6. 标记三维点_三维扫描仪对汽车钣金外形检测折弯件钣金件热成型加工件的应用...
  7. leetcode c程序总提示主函数_帅气中国小哥出“大招”,程序员跳槽面试刷题必备...
  8. matlab ktrlink,大神们,怎么设置滑动滑动条然后出来的图形也跟着变化?
  9. 苹果市值破3万亿美元!仅次于德国GDP
  10. 圆圈在动吗?这个骗过人眼的动图火了,LeCun解释原理:和CNN对抗攻击类似