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实战-个人博客-使用类组织配置
使用类组织配置 在实际需求中,我们往往需要不同的配置组合.例如,开发用的配置,测试用的配置,生产环境用的配置.为了能方便地在这些配置中切换,你可以把配置文件升级为包,然后为这些使用场景分别创建不同的配 ...
随机推荐
- 《30天自制操作系统》笔记2 --- 初步了解汇编产生的二进制(Day1)
nask.exe应该就是nas kit(nas开发工具的意思),由于这个编译器是作者自己写的,所以这种汇编语言应该是作者改造出来的,所以我叫它nas汇编语言. 作者说nask是模仿nasm语法的,关于 ...
- WPF DataGrid 鼠标对表格双击导致客户端崩溃
该问题是由于在创建DataGrid时没有设置为只读属性 解决: <DataGrid Name="switchInfoList" MouseLeftBu ...
- Windows下MySQL安装流程,8.0以上版本ROOT密码报错及修改
官网下载MySQL安装后,解压,添加环境变量,以管理员方式运行cmd,运行以下命令 mysqld --initialize --console mysqld -install net start my ...
- 企业应用向ASP.NET Core迁移
有人说.NET在国内的氛围越来越不行了,看博客园文章的浏览量也起不来.是不是要转Java呢? 没有必要扯起语言的纷争,Java也好C#都只是语言是工具,各有各的使用场景.以前是C#非开源以及不能在Li ...
- gojs常用API-画布操作
画布 获取当前画布的json myDiagram.model.toJson(); 加载json刷新画布 myDiagram.model = go.Model.fromJson(model); 删除选中 ...
- Using MS Soap toolkit to generate web services .md
Different SOAP encoding styles - RPC, RPC-literal, and document-literal SOAP Remote Procedure Call(R ...
- Unity Shader 屏幕后效果——高斯模糊
高斯模糊是图像模糊处理中非常经典和常见的一种算法,也是Bloom屏幕效果的基础. 实现高斯模糊同样用到了卷积的概念,关于卷积的概念和原理详见我的另一篇博客: https://www.cnblogs.c ...
- RabbitMQ的构架
初识rabbitMQ RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现. AMQP :Advanced Message Queue,高级消息队列协议.它是应用层协议的一个开放 ...
- mysql中的回表查询与索引覆盖
了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...
- eclipse卡在revert resources的解决方法
遇到Eclipse卡在Revert Resources进程的问题,等又等不到它执行完毕(进度一直是0%),取消又是石沉大海一样毫无动静.更气人的是这个进程阻塞了其他所有的进程,什么操作都做不了.真是苦 ...