当前位置: 首页 > news >正文

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

这是《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 Bootstrap5db = SQLAlchemy()
moment = Moment()
bootstrap = Bootstrap5()

models.py

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

from datetime import datetime
from exts import dbclass 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, Lengthclass 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_templatedef page_not_found(e):return render_template('errors/404.html'), 404def 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 Fakerfrom models import Messagedb.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_errorapp = 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.lryc.cn/news/63962.html

相关文章:

  • vmware 详细安装教程
  • Python 爬虫工具
  • 再也不去字节跳动面试了,6年测开经验的真实面试经历.....
  • 第十五章 角色移动旋转实例
  • 数据湖Data Lakehouse支持行级更改的策略:COW、MOR、Delete+Insert
  • 双亲委派机制的原理和作用
  • mac免费杀毒软件哪个好用?如何清理mac系统需要垃圾
  • css 实现太极效果
  • 【前端基础知识】Vue中的变量不是响应式的吗?属性赋值后视图不变化的原因是什么?
  • 如何完全卸载linux下通过rpm安装的mysql
  • [渗透教程]-004-长城防火墙GFW的原理
  • LaTeX基础文本排版命令
  • PLC模糊控制模糊PID(梯形图实现+算法分析)
  • 线程池在Java多线程中的应用
  • 1997-2021年全国30省技术市场成交额(亿元)
  • 【C++】面向对象之多态
  • 卡尔曼滤波器简介——多维卡尔曼滤波
  • 如何用 GPT-4 帮你写游戏?
  • R语言的贝叶斯时空数据模型实践技术应用
  • Lazysysadmin靶机渗透过程
  • 为什么网络安全缺口很大,招聘却很少?
  • SpringBoot手册
  • 【Linux】如何实现单机版QQ,来看进程间通信之管道
  • 从一到无穷大 #6 盘满排查过程
  • ChatGPT技术原理 第九章:数据集和训练技巧
  • NCR被攻击后服务中断!原是BlackCat勒索软件作祟
  • 带你认识什么是BMS(电池管理系统)
  • 安装Ubuntu22.04虚拟机的一些常见问题解决方法
  • 银河麒麟操作系统,安装Gitlab 基于docker
  • 基于Python实现个人手机定位分析