一, 写在前面
正所谓 "纸上得来终觉浅, 方知此事要躬行", 在看文档和视频之余, 我觉得还是要动手做点什么东西才能更好地学习吧, 毕竟有些东西光看文档真的难以理解, 于是就试着使用 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['SECRET_KEY'] = '123456'
- 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 = True
- except:
- 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!
来源: https://www.cnblogs.com/TM0831/p/11110449.html