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] 350. Intersection of Two Arrays II 两个数组相交之二

    Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...

  2. UDF——处理二维网格的利器:Boost.Geometry库

    本文编译工具:VC++ UDF Studio 该插件可以直接在Visual Studio中一键编译.加载.调试UDF源码,极大提高编写排错效率,且支持C++,MFC,Windows API和第三方库, ...

  3. oracle--PMON

    一,PMON功能 a) 监控其他非核心后台进程,如果其他非核心后台进程意外终止,则由 它重启: b) 清洁意外终止的死链接在后天残留的垃圾:将其修改的数据回退,释 放锁: pmon会不断给每个连接发包 ...

  4. JVM系列之三:类装载器子系统

    0. JVM架构图 Java虚拟机主要分为五大模块:类装载器子系统.运行时数据区.执行引擎.本地方法接口和垃圾收集模块. 1. 类的加载 虚拟机类装载器子系统:虚拟机把描述类的数据从class文件加载 ...

  5. C++ 类中的3种访问权限和继承方式

    访问权限:public 可以被任意实体访问,protected 只允许子类(无论什么继承方式)及本类的成员函数访问,private 只允许本类的成员函数访问.三种继承方式分别是 public 继承,p ...

  6. 【MySQL】Mariadb字符集

    Mariadb字符集 如果不设置字符集,可以查看mariadb的字符集的默认设置是latin1. 如下命令,查看Mariadb的默认配置: [root@oradb ~]# /usr/local/mys ...

  7. GNU Makefile中的条件控制结构

    在常见的编程语言中,使用条件控制结构诸如if ... else if ... else...是很寻常的事情,那么在GNU Makefile中如何使用呢? ifeq ifneq 例如:foo.sh #! ...

  8. pytest_demo_实战2_fixture应用

    1.py文件所在文件夹下创建 __init__.py 文件 2.文件夹目录下:创建conftest.py import pytest # @pytest.fixture() 里面没有参数,那么默认sc ...

  9. Win10 CompatTelRunner.exe占用磁盘高的解决办法

    (1)在运行里输入  taskschd.msc, 打开windows计划任务 (2)参考下图在Application Experience下,1,2,3,4步骤,把所有带有 “CompatTelRun ...

  10. Spring aop的一些小知识点总结

    1 Spring的aop无法拦截静态方法 2 在 proxyTargetClass = false时 对于实现了接口的bean,则只有接口中的方法会被拦截: 对于没有实现任何接口的bean,publi ...