一、寫在前面
正所謂“紙上得來終覺淺,方知此事要躬行”,在看文件和視訊之餘,我覺得還是要動手做點什麼東西才能更好地學習吧,畢竟有些東西光看文件真的難以理解,於是就試著使用Flask框架做了一個簡易留言板,實現了註冊、登入和留言的功能。
二、開發環境
系統:Windows10
Python版本:Python3.7
Flask版本:Flask 1.0.2
MySQL版本:MySQL8.0
三、具體步驟
1.連線資料庫
在做連線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常用資料型別:
1)Integer,整形,對映到資料庫中是int型別。
2)String,可變字元型別,對映到資料庫中是varchar型別。
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!