基于Flask的留言板的设计与实现

news2024/12/23 22:55:21

这是《Flask Web开发实战:入门、进阶与原理解析》这本书中的一个小项目,我在学习后根据书中的教程实现了留言板的功能,并结合我的思路将代码做了一些调整。
下面这是实现后的展示图片
在这里插入图片描述

文章目录

  • 设计思路
  • 项目代码
    • exts.py
    • models.py
    • forms.py
    • errors.py
    • commands.py
    • config.py
    • app.py
  • Blueprint 蓝图
  • static和templates文件
  • 完整代码

设计思路

留言板得有一个表单提供昵称以及留言的输入功能,在数据库保存的数据应该包括(留言ID,昵称,留言内容,留言时间),然后还需要有一个搜索留言内容的功能。后端使用python flask,前端使用html+css+js和bootstrap,数据库使用mysql。
项目结构如下
在这里插入图片描述

项目代码

exts.py

引入了flask_sqlalchemy,flask_moment,flask_bootstrap这三个库,具体的作用及使用可以参考pypi网站。

from flask_sqlalchemy import SQLAlchemy
from flask_moment import Moment
from flask_bootstrap import Bootstrap5

db = SQLAlchemy()
moment = Moment()
bootstrap = Bootstrap5()

models.py

设计数据库中数据表(可以有多个),数据表名message,四个字段
(id:留言id,整型,主键,自增;
name:昵称,字符型,长度20,非空;
body:留言内容,字符型,长度200,非空;
timestamp:留言创建的时间,日期类型,默认值提交留言的时间,索引)

from datetime import datetime
from exts import db

class Message(db.Model):
	__tablename__ = 'message'#指定表名
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(20), nullable=False)
    body = db.Column(db.String(200), nullable=False)
    timestamp = db.Column(db.DateTime, default=datetime.now, index=True)

forms.py

提交留言的表单,name:昵称输入框,非空,长度1-20;body:留言输入框,非空,长度1-200;submit:提交按钮,显示值为提交留言。

from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField, TextAreaField
from wtforms.validators import DataRequired, Length

class HelloForm(FlaskForm):
    name = StringField('昵称', validators=[DataRequired(), Length(1, 20)])
    body = TextAreaField('留言', validators=[DataRequired(), Length(1, 200)])
    submit = SubmitField('提交留言')

errors.py

设计访问错误时显示的页面,如访问不存在的url等等。

from flask import render_template

def page_not_found(e):
    return render_template('errors/404.html'), 404
    
def internal_server_error(e):
    return render_template('errors/500.html'), 500

如下图所示
在这里插入图片描述

commands.py

在这个代码里,设置了一个生成虚拟留言数据的功能,主要用于在开发项目时测试留言板功能是否正常,如留言搜索功能,分页功能,留言时间显示功能等等(手动添加测试数据很麻烦,一两条还好说,一两千条手动添加耗时且枯燥。)
使用方法,在命令行(windows cmd,或者linux 打开终端,pycharm下方的终端…等等)进入到项目app.py所在的目录,运行命令flask forge 生成default条虚拟数据(代码中default我设置为了20);flask forge --count xxx 生成xxx条虚拟数据。这个项目大概几百几千条测试数据就足够了。

import click
from exts import db

@click.command()
@click.option('--count', default=20, help='Quantity of messages, default is 20.')
def forge(count):
    """Generate fake messages."""
    from faker import Faker
    from models import Message
    db.drop_all()
    db.create_all()
    fake = Faker()
    click.echo('Working...')
    for i in range(count):
        message = Message(
            name=fake.name(),
            body=fake.sentence(),
            timestamp=fake.date_time_this_year()
        )
        db.session.add(message)
    db.session.commit()
    click.echo('Created %d fake messages.' % count)

config.py

SECRET_KEY:用于保护 Flask 应用程序的安全。它是一个用于加密和解密数据的随机字符串。
作用:

  1. 保护表单数据免受跨站点请求伪造 (CSRF) 攻击。
  2. 对用户会话数据进行加密和解密,以保护用户数据的安全性。

在 Flask 应用程序中,SECRET_KEY 的值应该是随机生成的,足够长,复杂度高,不易被猜测到。注意在正式开发中不要暴露像SECRET_KEY这种配置的值,不要把真实的值提交到github或者放在博客中等等。切记
下面我给一个SECRET_KEY值的生成代码,你们可以参考使用:

# import secrets
# # 生成一个16字节长的随机字符串作为 SECRET_KEY
# secret_key = secrets.token_hex(16)
# print(secret_key)

config.py文件里设置SECRET_KEY以及数据库的配置信息

SECRET_KEY = "xxx"#自定义

# 数据库配置信息
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'messageboard' #数据库名称
USERNAME = 'xxxx'
PASSWORD = 'xxxx'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
SQLALCHEMY_DATABASE_URI = DB_URI

app.py

在flask应用文件里将flask应用程序和使用的扩展相结合。
flask_migrate是一个Flask扩展,它提供了一个简单的命令行接口来管理应用程序的数据库迁移。前面写过,models.py文件是数据表的定义文件,里面定义了数据表的表名,字段名等等。
如果你编写了models.py文件要在数据库中生成数据表,在终端命令行里依次运行flask db init;flask db migrate;flask db upgrade。这时数据库中就会出现数据表。
如果你已经运行了flask db init;后面如果你修改了models.py文件,只需要运行flask db migrate;flask db upgrade即可。

from flask import Flask, redirect, url_for
from exts import db, moment, bootstrap
import config
from blueprints.messages import messages as messages_bp
from flask_migrate import Migrate
from commands import forge
from errors import page_not_found, internal_server_error

app = Flask(__name__)
app.config.from_object(config)
migrate = Migrate(app, db)
'''
迁移三部曲flask db init(初始执行一次即可);flask db migrate;flask db upgrade;
'''
db.init_app(app)
moment.init_app(app)
bootstrap.init_app(app)

app.register_blueprint(messages_bp)

app.cli.add_command(forge)
app.errorhandler(404)(page_not_found)
app.errorhandler(500)(internal_server_error)

@app.route('/')
def index(page=None):
    return redirect(url_for('messages.index'))

if __name__ == '__main__':
    app.run()

其中下面这两段代码是导入并注册蓝图,蓝图下面再解释。

from blueprints.messages import messages as messages_bp
app.register_blueprint(messages_bp)

Blueprint 蓝图

Flask Blueprints是一种组织Flask应用程序的方法,它将应用程序分解为可重用的模块。Blueprints可以包含路由、模板、静态文件和其他与应用程序相关的代码。Blueprints使得在Flask应用程序中添加和删除功能更加容易,同时也使得应用程序更加模块化和可维护。Blueprints还可以用于将应用程序分解为多个子应用程序,以便更好地管理和扩展应用程序。
在这里插入图片描述
在我这个项目中,使用pycharm的话是新建名为blueprints的python软件包。新建目录的话也可以,你得手动新建__init__.py文件。
messages.py文件表示留言子应用程序,如果以后添加用户注册登录的功能,那么就新建一个auth.py用户子应用程序。
messages.py部分内容
在这里插入图片描述

static和templates文件

在这里插入图片描述

完整代码

我不确定有没有人对我写的这篇文章感兴趣,如果需要我写的更完整一些,麻烦点赞评论哦~我看情况再更新。你们的支持就是我创作的动力!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472978.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DMDTS:DM迁移到SQL脚本

DMDTS:DM迁移到SQL脚本 环境介绍1 注册工程2 新建迁移3 迁移工具介绍4 选择迁移方式5 配置数据源6 配置SQL脚本文件7 配置源端获取对象方式和迁移策略8 选择指定对象复制9 选择迁移对象9.1 迁移对象的配置 - - 转换 设置表的映射关系 10 审阅迁移任务11 完成迁移 环境介绍 DM管…

一文了解使用Moonbeam原生跨链的潜力项目

跨链互连合约是Moonbeam独特的原生跨链解决方案,不仅帮助开发团队在Moonbeam网络即可解锁不同公链的特色功能,而且各类去中心化应用的终端使用者能因此获得更便捷安全的跨链体验。 Moonbeam的原生跨链解决方案包含Polkadot生态、不同异构链和Moonbeam生…

hitcontraining_uaf

1,三连 基本信息:x86-32-el,堆题思路; 保护:Partial RELRO。 堆题多看一个Libc: 2,IDA分析 main功能: add_note()功能: malloc了两次: 8字节填充(利用点之一&#xf…

Markdown快速入门教程

Markdown 的目标是实现「易读易写」,并强调它的「可读性」,因此Markdown 的语法全由标点符号所组成,并经过严谨慎选,是为了让它们看起来就像所要表达的意思;以下是Markdown 大部分的语法。 常用语法- 文字样式 文字字…

Allegro过孔盖油和过孔开窗设置(部分过孔开窗)

Allegro设置一部分过孔盖油,另一部分过孔开窗。 过孔开窗:过孔部分去除阻焊,便于调试和散热; 过孔盖油:过孔盖上阻焊油墨,防止过孔连锡短路。 总结 使用pad designer设计两种via pad,一种不开…

分布式事务的几种解决方案

一.基础概念 1. 什么是事务 事务可以看做是一次大的活动,它由不同的小活动组成,这些活动 要么全部成功, 要么全部失败 2.本地事务 在计算机系统中,更多的是通过 关系型数据库来控制事务,这是利用数据库 本身的事务特性…

基于Qt的教务管理系统的设计与实现

获取代码: (1) 下载链接: https://download.csdn.net/download/kese7952/87741551 (2) 添加博主微信获取,备注来源: mryang511688 项目描述 技术:C、QT等 摘要: 随着学校规模的不断扩大,学生的流动变迁导致了学校在管理学生信息…

二叉堆(Binary Heap)

二叉堆(Binary Heap) 二叉堆概述优先级队列 二叉堆(Binary Heap)其实比较简单,但却非常有用,常见的应用二叉堆排序和优先级队列。本文将介绍二叉堆的基本性质、基本操作和二叉堆在优先级队列上的应用。 二…

abc 283E 经典dp

题意&#xff1a;https://www.luogu.com.cn/problem/AT_abc283_e 思路&#xff1a;非常经典的dp&#xff0c;设为前i行第i行是否反转和第i1行是否反转。 /*keep on going and never give up*/ #include<cstdio> #include<iostream> #include<queue> #inclu…

【Mysql】基础篇:DDL (data definition language) 总结

博主简介&#xff1a;努力学习的大一在校计算机专业学生&#xff0c;热爱学习和创作。目前在学习和分享&#xff1a;数据结构、Go&#xff0c;Java等相关知识。博主主页&#xff1a; 是瑶瑶子啦所属专栏: Mysql从入门到精通近期目标&#xff1a;写好专栏的每一篇文章 目录 一、…

pytest自动化框架之allure测试报告的用例描述设置

allure测试报告的用例描述相关方法&#xff1b;如下图 allure标记用例级别severity 在做自动化测试的过程中&#xff0c;测试用例越来越多的时候&#xff0c;如果执行一轮测试发现了几个测试不通过&#xff0c;我们也希望能快速统计出缺陷的等级。 pytest结合allure框架可以对…

Linux基础指令大讲解

文章目录 1.linux的历史2.如何安装linux3.如何创建和删除用户4.目录&#xff0c;文件&#xff0c;文件夹区别5.pwd6.ls6.1基础语法6.2常用选项 7.alias 和 which的配套使用7.1基础格式7.2解释7.3与其关联的一些命令 8.cd8.1相对路径和绝对路径8.2运行可执行程序的方法8.3cd的基…

Java学习(韩顺平670-675)

目录 在我看来&#xff0c;我们在Java需要不断封包的原因就是为了使用不同类库中自己所需的方法&#xff0c;我们才要进行封装的&#xff0c;你怎么看&#xff1f; 你好&#xff0c;什么叫做关闭外层流 关于字符流要求 服务端/客户端 TCP网络通信编程//●//应用案例4 TCPFil…

dbForge Edge 4in1 Enterprise Edition Crack

单一解决方案中的四个数据库 IDE dbForge Edge 赋予自己开发和管理 SQL Server、MySQL、Oracle 和 PostgreSQL 数据库的广泛能力 概述 dbForge Edge&#xff1a;您的终极多数据库解决方案 让我们来看看。您需要处理多个数据库管理系统。同时&#xff0c;您希望能够灵活有效地…

好用的项目管理软件的具体功能有哪些

随着企业规模不断的扩大&#xff0c;项目管理往往会面临更多的挑战与难题&#xff0c;最常见的会出现以下几个问题&#xff1a;资源消耗失控&#xff0c;而项目部门和相关部门之间沟通越来越困难&#xff1b;团队凝聚力下降、项目进度难以把控&#xff0c;项目成本几乎失控&…

书接上回,接着研究当今世上缓存第一人

书接上回&#xff0c;接着研究当今世上缓存第一人&#xff0c;记得留下的关注&#xff0c;收藏起来以后观看。 五 三大特殊数据类型 1 geospatial&#xff08;地理位置&#xff09; 1.geospatial将指定的地理空间位置&#xff08;纬度、经度、名称&#xff09;添加到指定的ke…

国民技术N32G430开发笔记(12)- IAP升级 Settings区域数据初始化

IAP升级 Settings区域数据初始化 1、假如&#xff0c;有两个产品&#xff0c;A产品跟B产品&#xff0c;硬件都一样&#xff0c;要求一个软件里的board_name为N32G430C8L7_STB_A&#xff0c;另一个软件里的board_name为N32G430C8L7_STB_B。 那我们如何在不改boot程序跟App程序的…

Matlab App Designer制作一个UART的GUI总结

目录 前言 读取串口数据速度慢 Axes响应慢 总结 前言 最近尝试了一下用Matlab App Designer制作一个上位机通信软件&#xff0c;专门用于读取电机控制里面的相电流&#xff0c;角度等高实时性的数据&#xff0c;已经在VOFA里面实现了。STM32 VOFA串口调试助手提升电机控制调试…

拷贝构造函数和运算符重载

文章目录 拷贝构造函数特点分析拷贝构造函数情景 赋值运算符重载运算符重载operator<运算符重载 赋值运算符前置和后置重载 拷贝构造函数 在创建对象的时候&#xff0c;是不是存在一种函数&#xff0c;使得能创建一个于已经存在的对象一模一样的新对象&#xff0c;那么接下…

Kotlin注解

文章参考 1、概念 注解可以对 类、函数、函数参数、属性等 做标注 注解信息可用于 源码级、编译期、运行时 示例 Retention(AnnotationRetention.RUNTIME) //作用于运行时 Target(AnnotationTarget.CLASS) //限定作用于类 annotation class Api(val url: String)/*** Rete…