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实战-个人博客-数据库-生成虚拟数据 --的更多相关文章

  1. Flask实战-留言板-使用Faker生成虚拟数据

    使用Faker生成虚拟数据 创建虚拟数据是编写Web程序时的常见需求.在简单的场景下,我们可以手动创建一些虚拟数据,但更方便的选择是使用第三方库实现.流行的python虚拟数据生成工具有Mimesis ...

  2. flask实战-个人博客-编写博客前台

    编写博客前台 博客前台需要开放给所有用户,这里包括显示文章列表.博客信息.文章内容和评论等功能功能. 分页显示文章列表 为了在主页显示文章列表,我们要先在渲染主页模板的index视图的数据库中获取所有 ...

  3. flask实战-个人博客-虚拟环境、项目结构

    个人博客 博客是典型的CMS(Content Management system,内容管理系统),通常由两部分组成:一部分是博客前台,用来展示开放给所有用户的博客内容:另一部分是博客后台,这部分内容仅 ...

  4. flask实战-个人博客-使用蓝本模块化程序

    使用蓝本模块化程序 实例化flask提供的blueprint类就创建一个蓝本实例.像程序实例一样,我们可以为蓝本实例注册路由.错误处理函数.上下文处理函数,请求处理函数,甚至是单独的静态文件文件夹和模 ...

  5. flask实战-个人博客-电子邮件支持

    电子邮件支持 因为博客要支持评论,所以我们需要在文章有了新评论后发邮件通知管理员.而且,当管理员回复了读者的评论后,也需要发送邮件提醒读者. 为了方便读者使用示例程序,personalBlog中仍然使 ...

  6. flask实战-个人博客-表单

    表单 下面我们来编写所有表单类,personalBlog中主要包含下面这些表单: 登录表单: 文章表单: 评论表单: 博客设置表单: 这里仅介绍登录表单.文章表单.分类表单和评论表单,其他的表单在实现 ...

  7. flask实战-个人博客-模板 --

    模板 personalBlog采用典型的博客布局,左侧三分之二为主体,显示文章列表.正文:右侧三分之一为边栏,显示分为类列表.社交链接等.现在的工作是将HTML文件加工为模板,并创建对应的表单类,在模 ...

  8. flask实战-个人博客-程序骨架、创建数据库模型、临接列表关系 --

    编写程序骨架 personalBlog的功能主要分为三部分:博客前台.用户认证.博客后台,其中包含的功能点如下图所示: 数据库 personalBlog一共需要使用四张表,分别存储管理员(Admin) ...

  9. flask实战-个人博客-使用类组织配置

    使用类组织配置 在实际需求中,我们往往需要不同的配置组合.例如,开发用的配置,测试用的配置,生产环境用的配置.为了能方便地在这些配置中切换,你可以把配置文件升级为包,然后为这些使用场景分别创建不同的配 ...

随机推荐

  1. [LeetCode] 266. Palindrome Permutation 回文全排列

    Given a string, determine if a permutation of the string could form a palindrome. Example 1: Input: ...

  2. @Value不能给静态变量直接赋值问题

    1. 平时用的时候,直接在变量头上加上@Value就能到值(其中path.url是配置文件properties的.). @Value("${path.url}") private ...

  3. GreenPlum 大数据平台--常用命令

    gpstate 命令 参数 作用 gpstate -b => 显示简要状态 gpstate -c => 显示主镜像映射 gpstart -d => 指定数据目录(默认值:$MASTE ...

  4. python前后台tcp/udp通讯示例

    以下代码兼容python2.7+.python3 TCP示例 服务器 -- sever_tcp.py #!/usr/bin/env python #coding=utf-8 import time i ...

  5. redis-安装卸载

    1.安装service服务 redis-server --service-install [配置文件位置,如:redis.conf] (--service-name 服务名称) 2.启动service ...

  6. 微信企业号获取OpenID过程

    define('CorpID', "wx82e2c31215d9a5a7"); define('CorpSecret', ""); //当前管理组 设置-> ...

  7. 【08月02日】A股滚动市盈率PE历史新低排名

    2010年01月01日 到 2019年08月02日 之间,滚动市盈率历史新低排名. 上市三年以上的公司,2019年08月02日市盈率在300以下的公司. 1 - XD栖霞建(SH600533) - 历 ...

  8. sublime-text-3-build-3207 破解+注册码

    按照以下步骤依次进行 打开 https://hexed.it/ 单机 "Open file" 并选择 "sublime_text.exe" 可执行文件. 转到 ...

  9. Webpack 4 : ERROR in Entry module not found: Error: Can't resolve './src'

    ERROR in Entry module not found: Error: Can't resolve './src' in 'E:\ASUS\Documents\VSCode files\Web ...

  10. JS操作摄像头

    <script src="javascript/jquery-1.9.1.min.js"></script> <fieldset> <le ...