正所谓“纸上得来终觉浅,方知此事要躬行”,在看文档和视频之余,我以为仍是要动手作点什么东西才能更好地学习吧,毕竟有些东西光看文档真的难以理解,因而就试着使用Flask框架作了一个简易留言板,实现了注册、登陆和留言的功能。html
系统:Windows10前端
Python版本:Python3.7mysql
Flask版本:Flask 1.0.2git
MySQL版本:MySQL8.0github
1.链接数据库sql
在作链接MySQL数据库的时候碰到了一堆问题,在上两篇博客中都有提到,这里就很少说了。完成数据库设置以后,我建立了两张表,一张用于储存用户信息的users表,一张用于储存留言信息的messages表。定义两张表的代码以下:数据库
1 from flask_sqlalchemy import SQLAlchemy 2 import mysql.connector 3 4 app = Flask(__name__) 5 app.config['SECRET_KEY'] = '123456' 6 app.config['SQLALCHEMY_DATABASE_URI'] = "mysql+mysqlconnector://root:qwer1234@localhost/flask?auth_plugin=mysql_native_password" 7 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True 8 app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True 9 10 # 获取SQLAlchemy实例对象 11 db = SQLAlchemy(app) 12 13 14 # 用户 15 class User(db.Model): 16 __tablename__ = "users" 17 id = db.Column(db.Integer, primary_key=True) 18 username = db.Column(db.String(16), unique=True) # 用户名 19 password = db.Column(db.String(16)) # 密码 20 email = db.Column(db.String(32), unique=True) # 邮箱 21 22 def __repr__(self): 23 return '<User %r>' % self.username 24 25 26 # 留言 27 class Message(db.Model): 28 __tablename__ = "messages" 29 id = db.Column(db.Integer, primary_key=True) 30 user = db.Column(db.String(16)) # 用户名 31 content = db.Column(db.String(100)) # 内容 32 date = db.Column(db.Date) # 日期 33 time = db.Column(db.Time) # 时间 34 is_anonymous = db.Column(db.Boolean) # 是否匿名 35 36 def __repr__(self): 37 return '<Message %r User %r>' % (self.id, self.user)
这里先说下SQLAlchemy经常使用数据类型:flask
1)Integer,整形,映射到数据库中是int类型。session
2)String,可变字符类型,映射到数据库中是varchar类型。app
3)Date,存储时间,只能存储年月日。映射到数据库中是date类型。
4)Time,存储时间,能够存储时分秒。映射到数据库中也是time类型。
5)Boolean,布尔类型,映射到数据库中的是tinyint类型。
能够看到两张表中都有一个值为整数的id字段,该字段为主键,而后就是两个类中都有__repr__()方法,该方法和__str__()相似,会返回对这个类的描述。可是这还只是完成了对这两张表的定义,尚未在数据库中完成建立。我是把表的定义写在app.py中的,而后建立了一个model.py用于实现建立数据表,其中的代码以下:
1 from app import db 2 3 4 db.create_all()
2.用户注册
注册的时候须要输入用户名、密码和邮箱,前端完成验证,后台完成注册用户的操做。在进行数据库操做的时候,可能由于某些缘由致使用户注册失败,因此仍是须要使用异常处理的,若注册失败则返回注册页面并显示提示信息,若注册成功则使用redirect()方法跳转到登陆页面,好比跳转到登陆页面的的代码就是:
redirect(url_for("login"))
注册须要GET方法和POST方法,所以在编写路由的时候须要写上methods=['GET','POST'],完整代码以下:
1 @app.route('/register', methods=['GET', 'POST']) 2 def register(): 3 if request.method == 'GET': 4 return render_template('register.html') 5 else: 6 try: 7 usr = User() 8 usr.id = User.query.count() + 1 9 usr.username = request.form["usr"] 10 usr.password = request.form["pwd"] 11 usr.email = request.form["email"] 12 db.session.add(usr) 13 db.session.commit() 14 return redirect(url_for("login")) 15 except: 16 return render_template('register.html', msg="注册失败!请重试!")
3.用户登陆
用户登陆的时候须要对输入的用户名和密码进行验证,验证用户名是否存在和密码是否正确。在上一篇博客中已经简单介绍过Flask中使用SQLAlchemy的一些基本操做,而在用户登陆的时候须要根据用户名来查询,也就是要使用filter()方法,语句以下:
User.query.filter(User.username == usr)
可是这样还不能获得结果,须要在后面加上一个all()才能获得查询结果。若是用户名和密码都正确,则可以登陆成功,此时要使用session来记录用户名,而后跳转到留言主页。
1 @app.route('/login', methods=['GET', 'POST']) 2 def login(): 3 if request.method == "GET": 4 return render_template("login.html") 5 else: 6 usr = request.form["usr"] 7 pwd = request.form["pwd"] 8 try: 9 the_user = User.query.filter(User.username == usr).all() # 查询用户是否存在 10 if len(the_user) == 1: 11 if the_user[0].password == pwd: 12 session.clear() 13 session["user"] = usr 14 return redirect(url_for("index")) 15 else: 16 msg = "密码错误!" 17 return render_template("login.html", msg=msg) 18 else: 19 msg = "用户名不存在!" 20 return render_template("login.html", msg=msg) 21 except: 22 msg = "登陆失败,请重试!" 23 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方法,而后就是须要查询留言数据并显示到页面上,代码以下:
1 @app.route('/index', methods=['GET', 'POST']) 2 def index(): 3 if request.method == 'GET': 4 result = Message.query.all() 5 return render_template("index.html", result=result) 6 else: 7 msg = Message() 8 msg.id = len(Message.query.all()) + 1 9 msg.user = session["user"] 10 msg.content = request.form["text_input"] # 留言内容 11 now = datetime.datetime.now() # 获取当前时间 12 msg.date = now.date() 13 msg.time = datetime.time(now.hour, now.minute, now.second) 14 try: 15 key = request.form["the_select"] 16 msg.is_anonymous = True 17 except: 18 msg.is_anonymous = False 19 db.session.add(msg) 20 db.session.commit() 21 result = Message.query.all() 22 return render_template("index.html", result=result)
下面是一个留言主页的截图,其中有几条留言,有匿名的也有不匿名的:
这个留言板仍是很简单的,主要是刚开始学习Flask框架,有不少不了解的地方,所以遇到了不少问题也花了不少时间,后面我会继续学习,而且对这个留言板增长功能和进行改进的,好比回复别人的留言、删除本身的留言等等。
完整代码已上传到GitHub!