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. eclipse 设置所有文件编码为UTF-8(最全)

      如何修改eclipse工作空间的字符集以及项目的字符集? 第一种方式:修改eclipse的配置文件 打开{ECLIPSE_HOME}/eclipse.ini文件 在最后一行加上属性: -Dfile ...

  2. 【网络知识之二】HTTP协议

    HTTP协议(Hypertext Transfer Protocol,超文本传输协议),一种无状态的.应用层的.以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系 ...

  3. Spring Security简介与入门Demo

    1:Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配 ...

  4. nohup 启动后台应用

    nohup java -Xmx1024M -Xms1024M -jar app.jar --logging.level=warn --logging.path=/var/log/app--server ...

  5. 【C++】如何使用GCC生成动态库和静态库

    一.静态库和动态库的定义及区别 程序编译的四个过程: 1.预处理  展开头文件/宏替换/去掉注释/条件编译(.i后缀) 2.编译    检查语法,生成汇编(.s后缀) 3.汇编    汇编代码转换成机 ...

  6. Nginx php上传文件大小的设置

  7. 我自己整理的 Linux 常用命令

    1.查看文件安装路径: 由于软件安装的地方不止一个地方,所有先说查看文件安装的所有路径(地址). 这里以 xsp 为例.比如说我安装了xsp,但是不知道文件都安装在哪些地方.放在哪些文件夹里,可以用下 ...

  8. python网络爬虫(2)——scrapy框架的基础使用

    这里写一下爬虫大概的步骤,主要是自己巩固一下知识,顺便复习一下. 一,网络爬虫的步骤 1,创建一个工程 scrapy startproject 工程名称 创建好工程后,目录结构大概如下: 其中: sc ...

  9. .NET设计模式-观察者模式

    Observer(观察者模式) 定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新. 说白了就是事件. using System; namespa ...

  10. 在 Windows 上的 Visual Studio 中使用 Python

    地址:https://docs.microsoft.com/zh-cn/visualstudio/python/tutorial-working-with-python-in-visual-studi ...