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

1、寫在前面

  正所謂「紙上得來終覺淺,方知此事要躬行」,在看文檔和視頻之餘,我以爲仍是要動手作點什麼東西才能更好地學習吧,畢竟有些東西光看文檔真的難以理解,因而就試着使用Flask框架作了一個簡易留言板,實現了註冊、登陸和留言的功能。html

 

2、開發環境

  系統:Windows10前端

  Python版本:Python3.7mysql

  Flask版本:Flask 1.0.2git

  MySQL版本:MySQL8.0github

 

3、具體步驟

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)
 

4、運行截圖

  下面是一個留言主頁的截圖,其中有幾條留言,有匿名的也有不匿名的:

 

5、我的總結

  這個留言板仍是很簡單的,主要是剛開始學習Flask框架,有不少不了解的地方,所以遇到了不少問題也花了不少時間,後面我會繼續學習,而且對這個留言板增長功能和進行改進的,好比回覆別人的留言、刪除本身的留言等等。

  完整代碼已上傳到GitHub

相關文章
相關標籤/搜索