flask实战-个人博客-数据库-生成虚拟数据 --
3、生成虚拟数据
为了方便编写程序前台和后台功能,我们在创建数据库模型后就编写生成虚拟数据的函数。
1)管理员
用于生成虚拟管理员信息的fake_admin()函数如下所示:
personalBlog/fakes.py: 生成虚拟管理员信息
from personalBlog.models import Admin
from personalBlog.extensions import db def fake_admin():
admin = Admin(
username = 'admin',
blog_title = 'PersonalBlog',
blog_sub_title = "It is a good sample to practice flask",
name = 'Xia Xiaoxu',
about = 'Great, i am very happpy to see this book to learn flask!'
)
admin.set_password('persoanlBlog')
db.session.add(admin)
db.session.commit()
2)分类
用于生成虚拟分类的fake_categories()函数如下所示:
personalBlog/fakes.py : 创建虚拟分类
from faker import Faker from personalBlog.models import Category
from personalBlog.extensions import db def fake_categories(name = 10):
category = Category(name = 'Default')
db.session.add(category) for i in range(count):
category = Category(name = fake.word())
db.session.add(category)
try:
db.session.commit()
except:
db.session.roolback()
这个函数首先会创建一个默认分类,默认分类是创建文章时默认设置的分类。然后依次生成包含随机名称的虚拟分类。
和文章不同的是,分类的名称要求不能重复,如果随机生成的分类名和已创建的分类重名,就会导致数据库出错,抛出salalchemy.exc.IntegrityError异常。在这种情况下,我们可以使用try…except…语句来捕捉异常,在try子句中调用db.session.commit()提交数据库会话,如果发生sqlalchemy.exc.IntegrityError异常,就调用db.session.roolback()方法进行回滚操作。
3)文章
用于生成虚拟文章数据的fake_posts()函数如下所示:
personalBlog/fakes.py : 生成虚拟文章
from faker import Faker
from personalBlog.models import Post
from personalBlog.extensions import db fake = Faker() def fake_posts(count = 50):
for i in range(count):
post = Post(
title = fake.sentence(),
body = fake.text(2000),
category = Category.query.get(random.randint(1, Category.query.count())),
timestamp = fake.date_time_this_year()
)
db.session.add(post)
db.session.commit()
默认生成50篇文章,每一篇文章均指定了一个随机分类。随机分类使用get()查询方法获取,传入的主键值为1到所有分类数量数据之间的随机值。
4)评论
用于生成虚拟评论的fake_comments()函数如下所示:
personalBlog/fakes.py : 生成虚拟评论
from faker import Faker
from personalBlog.models import Comment
from personalBlog.extensions import db fake = Faker() def fake_comments(count = 500):
for i in range(count):
comment = Comment(
author = fake.name(),
email = fake.email(),
site = fake.url(),
body = fake.sentence(),
timestamp = fake.date_time_this_year(),
reviewed = True,
post = Post.query.get(random.randint(1, Post.query.count()))
)
db.session.add(comment) salt = int(count * 0.1)
for i in range(salt):
# 未审核评论
comment = Comment(
author = fake.name(),
email = fake.email(),
site = fake.url(),
body = fake.sentence(),
timestamp = fake.date_time_this_year(),
reviewed = False,
post = Post.query.get(random.randint(1, Post.query.count()))
)
db.session.add(comment) # 管理员发表的评论
comment = Comment(
author = 'Sam Xia',
email = 'sam@163.com',
site = 'example.com',
body = fake.sentence(),
timestamp = fake.date_time_this_year(),
from_admin = True,
reviewed = True,
post = Post.query.get(random.randint(1, Post.query.count()))
)
db.session.add(comment)
db.session.commit() # 回复
for i in range(salt):
comment = Comment(
author = fake.name(),
email = fake.email(),
site = fake.url(),
body = fake.sentence(),
timestamp = fake.date_time_this_year(),
reviewed = True,
replied = Comment.query.get(random.randint(1, Comment.query.count())),
post = Post.query.get(random.randint(1, Post.query.count()))
)
db.session.add(comment)
db.session.commit()
默认随机生成500条评论,另外再额外添加50条(count * 0.1)为审核评论、50条管理员评论和50条回复。
5)创建生成虚拟数据的命令
我们创建一个forge()函数来整合上述函数,如下所示:
personalBlog/personalBlog/__init__.py: 晚上register_commands()函数
def register_commands(app):
@app.cli.command()
@click.option('--category', default = 10, help = 'Quantity of categories, default is 10.')
@click.option('--post', default=50, help = 'Quantity of posts, default is 50.')
@click.option('--comment', default=500, help = 'Quantity of comments, default is 500.')
def forge(category, post, comment):
"""Generates the fake categories, posts, and comments."""
from personalBlog.fakes import fake_admin, fake_categories, fake_posts, fake_comments
db.drop_all()
db.create_all()
click.echo('Generating the administrator...')
fake_admin()
click.echo('Generating %d categories...' % category)
fake_categories(category)
click.echo('Generating %d posts...' % post)
fake_posts(post)
click.echo('Generating %d comments...' % comment)
fake_comments(comment)
click.echo('Done.')
为了正常生成数据,这里的生成顺序必须是管理员-> 分类 -> 文章 -> 评论。
虽然默认的数量能够满足常规需求,但是函数中使用click提供的option装饰器添加了对自定义数量支持。在这个函数中,为了更全面地生成虚拟数据,首先会删除并重建数据库表。 使用下面的命令,我们就会生成完整的虚拟博客数据:
flask forge:

通过添加命令选项生成20个分类、100片虚拟文章和1000个评论:
flask实战-个人博客-数据库-生成虚拟数据 --的更多相关文章
- Flask实战-留言板-使用Faker生成虚拟数据
使用Faker生成虚拟数据 创建虚拟数据是编写Web程序时的常见需求.在简单的场景下,我们可以手动创建一些虚拟数据,但更方便的选择是使用第三方库实现.流行的python虚拟数据生成工具有Mimesis ...
- flask实战-个人博客-编写博客前台
编写博客前台 博客前台需要开放给所有用户,这里包括显示文章列表.博客信息.文章内容和评论等功能功能. 分页显示文章列表 为了在主页显示文章列表,我们要先在渲染主页模板的index视图的数据库中获取所有 ...
- flask实战-个人博客-虚拟环境、项目结构
个人博客 博客是典型的CMS(Content Management system,内容管理系统),通常由两部分组成:一部分是博客前台,用来展示开放给所有用户的博客内容:另一部分是博客后台,这部分内容仅 ...
- flask实战-个人博客-使用蓝本模块化程序
使用蓝本模块化程序 实例化flask提供的blueprint类就创建一个蓝本实例.像程序实例一样,我们可以为蓝本实例注册路由.错误处理函数.上下文处理函数,请求处理函数,甚至是单独的静态文件文件夹和模 ...
- flask实战-个人博客-电子邮件支持
电子邮件支持 因为博客要支持评论,所以我们需要在文章有了新评论后发邮件通知管理员.而且,当管理员回复了读者的评论后,也需要发送邮件提醒读者. 为了方便读者使用示例程序,personalBlog中仍然使 ...
- flask实战-个人博客-表单
表单 下面我们来编写所有表单类,personalBlog中主要包含下面这些表单: 登录表单: 文章表单: 评论表单: 博客设置表单: 这里仅介绍登录表单.文章表单.分类表单和评论表单,其他的表单在实现 ...
- flask实战-个人博客-模板 --
模板 personalBlog采用典型的博客布局,左侧三分之二为主体,显示文章列表.正文:右侧三分之一为边栏,显示分为类列表.社交链接等.现在的工作是将HTML文件加工为模板,并创建对应的表单类,在模 ...
- flask实战-个人博客-程序骨架、创建数据库模型、临接列表关系 --
编写程序骨架 personalBlog的功能主要分为三部分:博客前台.用户认证.博客后台,其中包含的功能点如下图所示: 数据库 personalBlog一共需要使用四张表,分别存储管理员(Admin) ...
- flask实战-个人博客-使用类组织配置
使用类组织配置 在实际需求中,我们往往需要不同的配置组合.例如,开发用的配置,测试用的配置,生产环境用的配置.为了能方便地在这些配置中切换,你可以把配置文件升级为包,然后为这些使用场景分别创建不同的配 ...
随机推荐
- MySQL实战45讲学习笔记:第一讲
一.MySQL逻架构图 二.连接器工作原理刨析 1.连接器工作原理图 2.原理图说明 1.连接命令 mysql -h$ip -P$port -u$user -p 2.查询链接状态 3.长连接端连接 1 ...
- [LeetCode] 43. Multiply Strings 字符串相乘
Given two non-negative integers num1 and num2represented as strings, return the product of num1 and ...
- centos7 安装mysql5.7(二进制安装)
一.卸载默认安装的mariadb [root@localhost ~]# yum remove mariadb* -y 二.添加mysql用户 [root@localhost ~]# useradd ...
- Salesforce 开发新工具 - Visual Studio Code
最近尝试使用Visual Studio Code来做Salesforce的开发工具,体验上比Sublime好用不少,介绍下详细步骤 第一步:下载对应版本的Visual Studio Code 下载地址 ...
- QLayout及其子类 清除添加的widget
起初,我的思路是,先取得Layout的items数量, 然后通过索引来移除每一个items,代码如下: QHBoxLayout * hly = new QHBoxLayout; ; i < ; ...
- cefsharp参考笔记
https://blog.csdn.net/yh0503/article/details/86678115 https://blog.csdn.net/qq_17351077/article/deta ...
- Zookeeper 运维实践手册
Zookeeper是一个高可用的分布式数据管理与协调框架,该框架能很好地保证分布式环境中数据一致性.一般用来实现服务发现(类似DNS),配置管理,分布式锁,leader选举等. 一.生产环境中Zook ...
- Clean Code 笔记 之 第二章
你是否真正的会命名 前言 这是我第二次看这本书了(Clean Code)的时候,第一次看的时候是,看到某世界五百强在他们的代码中我竟然看不到一句注释,现在我还记得当时的情景,当我Download 下第 ...
- centos7安装pyenv
一.安装pyenv: 1.>安装依赖包: yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel ...
- Java设计模式原型模式
原型模式: – 通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式. – 就是java中的克隆技术,以某个对象为原型,复制出新的对象.显然,新的对象具备原型对象的特点 – 优势 ...