Flask學習之旅--簡易留言板

TM0831發表於2019-07-01

一、寫在前面

  正所謂“紙上得來終覺淺,方知此事要躬行”,在看文件和視訊之餘,我覺得還是要動手做點什麼東西才能更好地學習吧,畢竟有些東西光看文件真的難以理解,於是就試著使用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

相關文章