Flask学习之旅--简易留言板
一、写在前面
正所谓“纸上得来终觉浅,方知此事要躬行”,在看文档和视频之余,我觉得还是要动手做点什么东西才能更好地学习吧,毕竟有些东西光看文档真的难以理解,于是就试着使用Flask框架做了一个简易留言板,实现了注册、登录和留言的功能。
二、开发环境
系统:Windows10
Python版本:Python3.7
Flask版本:Flask 1.0.2
MySQL版本:MySQL8.0
三、具体步骤
1.连接数据库
在做连接MySQL数据库的时候碰到了一堆问题,在上两篇博客中都有提到,这里就不多说了。完成数据库设置之后,我创建了两张表,一张用于储存用户信息的users表,一张用于储存留言信息的messages表。定义两张表的代码如下:
from flask_sqlalchemy import SQLAlchemy
import mysql.connector
app = Flask(__name__)
app.config['
app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+mysqlconnector://root:qwer1234@localhost/flask?auth_plugin=mysql_native_password"
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 获取SQLAlchemy实例对象
db = SQLAlchemy(app)
# 用户
class User(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(16), unique=True) # 用户名
password = db.Column(db.String(16)) # 密码
email = db.Column(db.String(32), unique=True) # 邮箱
def __repr__(self):
return '<User %r>' % self.username
# 留言
class Message(db.Model):
__tablename__ = "messages"
id = db.Column(db.Integer, primary_key=True)
user = db.Column(db.String(16)) # 用户名
content = db.Column(db.String(100)) # 内容
date = db.Column(db.Date) # 日期
time = db.Column(db.Time) # 时间
is_anonymous = db.Column(db.Boolean) # 是否匿名
def __repr__(self):
return '<Message %r User %r>' % (self.id, self.user)
这里先说下SQLAlchemy常用数据类型:
1)Integer,整形,映射到数据库中是int类型。
2)String,可变字符类型,映射到数据库中是varchar类型。
3)Date,存储时间,只能存储年月日。映射到数据库中是date类型。
4)Time,存储时间,可以存储时分秒。映射到数据库中也是time类型。
5)Boolean,布尔类型,映射到数据库中的是tinyint类型。
可以看到两张表中都有一个值为整数的id字段,该字段为主键,然后就是两个类中都有__repr__()方法,该方法和__str__()类似,会返回对这个类的描述。但是这还只是完成了对这两张表的定义,还没有在数据库中完成创建。我是把表的定义写在app.py中的,然后创建了一个model.py用于实现创建数据表,其中的代码如下:
from app import db db.create_all()
2.用户注册
注册的时候需要输入用户名、密码和邮箱,前端完成验证,后台完成注册用户的操作。在进行数据库操作的时候,可能因为某些原因导致用户注册失败,所以还是需要使用异常处理的,若注册失败则返回注册页面并显示提示信息,若注册成功则使用redirect()方法跳转到登录页面,比如跳转到登录页面的的代码就是:
redirect(url_for("login"))
注册需要GET方法和POST方法,因此在编写路由的时候需要写上methods=['GET','POST'],完整代码如下:
@app.route('/register', methods=['GET', 'POST'])
def register():
if request.method == 'GET':
return render_template('register.html')
else:
try:
usr = User()
usr.id = User.query.count() + 1
usr.username = request.form["usr"]
usr.password = request.form["pwd"]
usr.email = request.form["email"]
db.session.add(usr)
db.session.commit()
return redirect(url_for("login"))
except:
return render_template('register.html', msg="注册失败!请重试!")
3.用户登录
用户登录的时候需要对输入的用户名和密码进行验证,验证用户名是否存在和密码是否正确。在上一篇博客中已经简单介绍过Flask中使用SQLAlchemy的一些基本操作,而在用户登录的时候需要根据用户名来查询,也就是要使用filter()方法,语句如下:
User.query.filter(User.username == usr)
但是这样还不能得到结果,需要在后面加上一个all()才能得到查询结果。如果用户名和密码都正确,则能够登录成功,此时要使用session来记录用户名,然后跳转到留言主页。
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == "GET":
return render_template("login.html")
else:
usr = request.form["usr"]
pwd = request.form["pwd"]
try:
the_user = User.query.filter(User.username == usr).all() # 查询用户是否存在
if len(the_user) == 1:
if the_user[0].password == pwd:
session.clear()
session["user"] = usr
return redirect(url_for("index"))
else:
msg = "密码错误!"
return render_template("login.html", msg=msg)
else:
msg = "用户名不存在!"
return render_template("login.html", msg=msg)
except:
msg = "登录失败,请重试!"
return render_template("login.html", msg=msg)
4.发表留言
用户登录后可以发表留言,用户在发表的时候还可以选择是否匿名,下面是留言板块的截图:

在后台接收到前端发送的用户的留言信息后,要通过session来获取用户名,还要用Python中的datetime模块来得到此时的日期时间,除此之外,还要知道用户是否选择了匿名。如果用户选择了匿名留言,则会向后台发送数据,反之则不会,所以要用异常处理来得到该数据,再将该字段的值设置为True或者False。
try: key = request.form["the_select"] msg.is_anonymous = Trueexcept: msg.is_anonymous = False
和前面一样的,留言主页也需要GET方法和POST方法,然后就是需要查询留言数据并显示到页面上,代码如下:
@app.route('/index', methods=['GET', 'POST'])
def index():
if request.method == 'GET':
result = Message.query.all()
return render_template("index.html", result=result)
else:
msg = Message()
msg.id = len(Message.query.all()) + 1
msg.user = session["user"]
msg.content = request.form["text_input"] # 留言内容
now = datetime.datetime.now() # 获取当前时间
msg.date = now.date()
msg.time = datetime.time(now.hour, now.minute, now.second)
try:
key = request.form["the_select"]
msg.is_anonymous = True
except:
msg.is_anonymous = False
db.session.add(msg)
db.session.commit()
result = Message.query.all()
return render_template("index.html", result=result)
四、运行截图
下面是一个留言主页的截图,其中有几条留言,有匿名的也有不匿名的:

五、个人总结
这个留言板还是很简单的,主要是刚开始学习Flask框架,有很多不了解的地方,因此遇到了很多问题也花了很多时间,后面我会继续学习,并且对这个留言板增加功能和进行改进的,比如回复别人的留言、删除自己的留言等等。
完整代码已上传到GitHub!
Flask学习之旅--简易留言板的更多相关文章
- 原生node实现简易留言板
原生node实现简易留言板 学习node,实现一个简单的留言板小demo 1. 使用模块 http模块 创建服务 fs模块 操作读取文件 url模块 便于path操作并读取表单提交数据 art-tem ...
- JSP简易留言板
写在前面 在上篇博文JSP内置对象中介绍JSP的9个内置对象的含义和常用方法,但都是比较理论的知识.今天为大家带来一个小应用,用application制作的简易留言板. 包括三个功能模块:留言提交.留 ...
- DOM操作相关案例 模态对话框,简易留言板,js模拟选择器hover,tab选项卡,购物车案例
1.模态框案例 需求: 打开网页时有一个普通的按钮,点击当前按钮显示一个背景图,中心并弹出一个弹出框,点击X的时候会关闭当前的模态框 代码如下: <!DOCTYPE html> <h ...
- php实现简易留言板效果
首先是Index页面效果图 index.php <?php header('content-type:text/html;charset=utf-8'); date_default_timezo ...
- AngularJs学习笔记(制作留言板)
原文地址:http://www.jmingzi.cn/?post=13 初学Anjularjs两天了,一边学一边写的留言板,只有一级回复嵌套.演示地址 这里总结一下学习的过程和笔记.另外,看看这篇文章 ...
- 微信小程序实现简易留言板
微信小程序现在很火,于是也就玩玩,做了一个简易的留言板,让大家看看,你们会说no picture you say a j8 a,好吧先上图. 样子就是的,功能一目了然,下面我们就贴实现的代码,首先是H ...
- Flask学习之旅--还是数据库(sqlacodegen + SQL Alchemy)
一.写在前面 其实之前已经写过一篇关于 Flask 中使用数据库的博客了,不过那一篇博客主要是记录我在使用 Flask + MySQL8.0 时所遇到的一些问题(如果用的不是 MySQL8.0估计就没 ...
- vue实现简易留言板
首先引入vue.js <script src="vue.js"></script> 布局 <div id="div"> &l ...
- js简易留言板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="U ...
随机推荐
- 在内部架设NuGet服务器(转)
在公司内部有很多基础框架或者基础组件,甚至对于使用SOA架构的公司来说,会有大量的业务组件的契约程序集,对于这些框架或组件的引用管理有的人使用源代码管理工具,但是NuGet相比源代码管理工具更方便: ...
- 通过控制台查看电脑中.net framework的版本
cmd打开控制台之后输入以下命令reg query "HKLM\Software\Microsoft\NET Framework Setup\NDP" /s /v version ...
- WPF动画旋转(3轴同时旋转问题)
原文:WPF动画旋转(3轴同时旋转问题) WPF的资料比较少,做起来不是很方便,之前一直有个XYZ3个轴同时旋转的问题,开始的时候以为通过 this.theRotateX.Axis = new Ve ...
- python 教程 第二十章、 数据库编程
第二十章. 数据库编程 环境设置 1).安装MySQL-python http://www.lfd.uci.edu/~gohlke/pythonlibs/ MySQL-python-1.2.3.win ...
- 机器学习: Tensor Flow with CNN 做表情识别
我们利用 TensorFlow 构造 CNN 做表情识别,我们用的是FER-2013 这个数据库, 这个数据库一共有 35887 张人脸图像,这里只是做一个简单到仿真实验,为了计算方便,我们用其中到 ...
- C#操作EXCEL常见操作集合(行高,列宽,合并单元格,单元格边框线)
private _Workbook _workBook = null; private Worksheet _workSheet = null; private Excel.Application _ ...
- WPF - 图形设计器(Diagram Designer)
原文:WPF - 图形设计器(Diagram Designer) OpenExpressApp计划中包括建模工具,计划是采用MetaEdit+模型来作为元模型,使用codeproject的<WP ...
- 源码编译路径错误导致的Apache 无法重启问题解决方法
问题现象: 第一次源码编译安装Apache设置路径错误,安装到/usr/local/src/ 目录下了. 删掉该目录下的安装文件,重新编译安装到/usr/local/目录下 重启apache服务时报这 ...
- liunx 桥接 上网 ip配置 外部网络访问
一.设置VMware 在vmware的[编辑]-->[虚拟网络编辑器]设置:将VMnet0设置为“桥接”,并桥接到宿主机器的网卡(可以是有线或者无线网络). 二.设置虚拟机系统(以cento ...
- delphi 获取大于2G的物理内存大小
一般情况下,我们是用GlobalMemoryStatus 来获取物理内存大小的 但该API在物理内存大小超过2G的时候,返回值均为2GB.因此,没有办法获取真实的物理内存大小,所以需要对此进行改进. ...