正所謂「紙上得來終覺淺,方知此事要躬行」,在看文檔和視頻之餘,我以爲仍是要動手作點什麼東西才能更好地學習吧,畢竟有些東西光看文檔真的難以理解,因而就試着使用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!