博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用 Flask 来写个轻博客 (11) — M(V)C_创建视图函数
阅读量:6633 次
发布时间:2019-06-25

本文共 4253 字,大约阅读时间需要 14 分钟。

目录

前文列表

视图函数

视图函数: 就是为 Jinja 模板文件中的变量准备数据对象的 Python 函数, 我们一般会在视图函数中准备好需要传递给 Jinja 模板文件的 Python 数据对象, 并应用到 Jinja 文件中的变量代码块中.

现在我们假设需要在 blog 中的每一个页面的右侧边栏(sidebar)中显示 最近发布的 5 篇文件文章数最多的 5 个标签, 我们就需要定义一个视图函数 sidebar_data(), 该函数就会为右侧边栏提供所需要的 Python 数据对象, 并且这些 Python 数据对象是能够从数据库中获取的.

在 views.py 文件中定义视图函数

定义右侧边栏的视图函数

from flask import render_templatefrom sqlalchemy import funcfrom main import appfrom models import db, User, Post, Tag, Comment, posts_tagsdef sidebar_data():    """Set the sidebar function."""    # Get post of recent    recent = 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
  • NOTE 1: 由于每个页面都需要右侧边栏的数据, 所以将这些高重用的代码抽象成为一个函数.

  • NOTE 2: sidebar_data() 函数中调用了 sqlalchemy.func 库, func 库提供了一个计数器 count 用于返回 tags 表中值相同的 post_id 列的数量,来得到 post 数最多的 tags。

  • NOTE 3: 因为 views.py 会作为所有视图函数的定义文件, 所以将 main.py 中的视图函数 home() 迁移到该文件中.

    • main.py
from flask import Flaskfrom config import DevConfigapp = Flask(__name__)# Import the views moduleviews = __import__('views')# Get the config from object of DecConfigapp.config.from_object(DevConfig)if __name__ == '__main__':    app.run()
  • NOTE 1: 因为 Flask Server 的 Route 使用 main 模块中查询路由函数(EG. home)的,所以必须将 views 模块中的视图函数(路由函数)导入到 main 模块的全局作用域中。

  • NOTE 2: 因为 views 模块中导入了 main.app 对象,而 main 模块又需要导入 views 模块,所以在 main.py 导入 views.py 之前一定要先生成 main.app 对象,否则会出现 NameError。

为每一张数据表定义视图函数

在设计数据库时, 就将所需要展现的页面和功能模块抽象到一个数据表中, 即每张数据表的数据都会被用于对应的 Jinja 模板中, 所以一般来说会为每张表即每一个不同的 Jinja 模板都定义一个视图函数, 但实际上可以灵活处理. 而且由因为这些视图函数都被 route() 装饰器所装饰,所以同时也充当着路由函数的功能。

  • views.py
@app.route('/')@app.route('/
')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/
')def post(post_id): """View function for post page""" post = db.session.query(Post).get_or_404(post_id) tags = post.tags comments = post.comment.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/
')def tag(tag_name): """View function for tag page""" tag = db.session.query(Tag).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)@app.route('/user/
')def user(username): """View function for user page""" user = db.session.query(User).filter_by(username=username).first_or_404() posts = user.posts.order_by(Post.publish_date.desc()).all() recent, top_tags = sidebar_data() return render_template('user.html', user=user, posts=posts, recent=recent, top_tags=top_tags)
  • NOTE 1: 定义视图函数时, 一般会按照下面几点来处理:

    • 获取主要的数据表对象, EG. posts
    • 获取与该表由关联的数据表对象, EG. posts 与 comments 是 one to many 的关系, posts 与 tags 是 many to many 的关系, 所以会 通过 posts 对象来获取 tags 对象和 comments 对象.
    • 最后会补充获取这一 Jinja 模板中仍需要的数据对象, EG. recent/top_tags
  • NOTE 2: flask 提供的 render_template() 函数, 就是将视图函数和 Jinja 模板文件关联起来的桥梁, 该函数的第一个参数就是 Jinja 模板文件的名称字符串, 之后的命名参数就是要传入该模板文件的数据对象, 而这些数据对象就会替代 Jinja 模板中的变量代码块.

  • NOTE 3: 为了提高代码的重用, 将每一个 Jinja 模板文件都会用到的右侧边栏所需要的数据抽象成一个函数.

  • NOTE 4: 在 app.route() 函数中可以定义多样的 URL 路由规则, 也可以为一个视图函数定义多条 URL 路由规则, 在这个 Blog 项目中的 URL 设计应该遵循 RESLful 风格.

转载于:https://www.cnblogs.com/jmilkfan-fanguiju/p/7532278.html

你可能感兴趣的文章
C#串口通信实例
查看>>
小程序数据返回时刷新当前页面数据
查看>>
jFinal 关联数据库操作
查看>>
团队冲刺第二天
查看>>
sed删除空行和开头的空格和tab键
查看>>
php扩展安装
查看>>
15个重要的Android代码
查看>>
(转)android 牛人必修 ant 编译android工程
查看>>
求最大公约数与最小公倍数
查看>>
C# Winform 跨线程更新UI控件常用方法总结(转)
查看>>
【WebService】使用jaxb完成对象和xml的转换
查看>>
如何去除My97 DatePicker控件上右键弹出官网的链接 - 如何debug混淆过的代码
查看>>
输入5个学生的信息(包括学号,姓名,英语成绩,计算机语言成绩和数据库成绩), 统计各学生的总分,然后将学生信息和统计结果存入test.txt文件中...
查看>>
BZOJ2337 [HNOI2011]XOR和路径
查看>>
C# 该行已经属于另一个表 ...
查看>>
android 避免线程的重复创建(HandlerThread、线程池)
查看>>
type的解释
查看>>
从自动驾驶到学习机器学习:解读2017科技发展的15大趋势
查看>>
在Linux中永久并安全删除文件和目录的方法
查看>>
全民直播时代 内容监管还得靠技术
查看>>