一、写在前面

  正所谓“纸上得来终觉浅,方知此事要躬行”,在看文档和视频之余,我觉得还是要动手做点什么东西才能更好地学习吧,毕竟有些东西光看文档真的难以理解,于是就试着使用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学习之旅--简易留言板的更多相关文章

  1. 原生node实现简易留言板

    原生node实现简易留言板 学习node,实现一个简单的留言板小demo 1. 使用模块 http模块 创建服务 fs模块 操作读取文件 url模块 便于path操作并读取表单提交数据 art-tem ...

  2. JSP简易留言板

    写在前面 在上篇博文JSP内置对象中介绍JSP的9个内置对象的含义和常用方法,但都是比较理论的知识.今天为大家带来一个小应用,用application制作的简易留言板. 包括三个功能模块:留言提交.留 ...

  3. DOM操作相关案例 模态对话框,简易留言板,js模拟选择器hover,tab选项卡,购物车案例

    1.模态框案例 需求: 打开网页时有一个普通的按钮,点击当前按钮显示一个背景图,中心并弹出一个弹出框,点击X的时候会关闭当前的模态框 代码如下: <!DOCTYPE html> <h ...

  4. php实现简易留言板效果

    首先是Index页面效果图 index.php <?php header('content-type:text/html;charset=utf-8'); date_default_timezo ...

  5. AngularJs学习笔记(制作留言板)

    原文地址:http://www.jmingzi.cn/?post=13 初学Anjularjs两天了,一边学一边写的留言板,只有一级回复嵌套.演示地址 这里总结一下学习的过程和笔记.另外,看看这篇文章 ...

  6. 微信小程序实现简易留言板

    微信小程序现在很火,于是也就玩玩,做了一个简易的留言板,让大家看看,你们会说no picture you say a j8 a,好吧先上图. 样子就是的,功能一目了然,下面我们就贴实现的代码,首先是H ...

  7. Flask学习之旅--还是数据库(sqlacodegen + SQL Alchemy)

    一.写在前面 其实之前已经写过一篇关于 Flask 中使用数据库的博客了,不过那一篇博客主要是记录我在使用 Flask + MySQL8.0 时所遇到的一些问题(如果用的不是 MySQL8.0估计就没 ...

  8. vue实现简易留言板

    首先引入vue.js <script src="vue.js"></script> 布局 <div id="div"> &l ...

  9. js简易留言板

      <!DOCTYPE html>   <html lang="en">   <head>   <meta charset="U ...

随机推荐

  1. Logical partitioning and virtualization in a heterogeneous architecture

    A method, apparatus, and computer usable program code for logical partitioning and virtualization in ...

  2. Android桌面悬浮窗效果实现,仿360手机卫士悬浮窗效果

    大家好,今天给大家带来一个仿360手机卫士悬浮窗效果的教程,在开始之前请允许我说几句不相干的废话. 不知不觉我发现自己接触Android已有近三个年头了,期间各种的成长少不了各位高手的帮助,总是有很多 ...

  3. Android的APK文件的反编译方法【转】

    实用的收藏一下. 来自:http://www.dewen.org/q/711/%E8%AF%B7%E6%95%99Android%E7%9A%84APK%E6%96%87%E4%BB%B6%E7%9A ...

  4. 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题

    原文 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题 虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越 ...

  5. IOC DI SL的一些理论

    本文来自圣杰的简书 圣杰 yubinfeng的 这篇文章也很不错 很简单

  6. ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 编辑表单 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 编辑表单 上一章节我们介绍了标签助手和 HT ...

  7. 用 theano 求解 Logistic Regression (SGD 优化算法)

    1. model 这里待求解的是一个 binary logistic regression,它是一个分类模型,参数是权值矩阵 W 和偏置向量 b.该模型所要估计的是概率 P(Y=1|x),简记为 p, ...

  8. 属性更改通知(INotifyPropertyChanged)——针对ObservableCollection

    问题 在开发webform中,wpf中的ObservableCollection<T>,MSDN中说,在添加项,移除项时此集合通知控件,我们知道对一个集合的操作是CURD但是恰恰没有Upd ...

  9. WCF学习目录

    WCF 基本 WCF概念 WCF配置文件详解 多个不同类对象传输思路 WCF 大文件传输配置 Uri ? & = 毫秒数据字符串转换为DateTime POST请求——HttpWebReque ...

  10. WPF 元素tag属性绑定一个属性或一个对象

    <Window x:Class="CollectionBinding.CategoryDataTemp"        xmlns="http://schemas. ...