python web學習2-連線資料庫
文章目錄
前言
之前學習了用flask進行簡單的網頁展示,並實現了簡單的使用者登入介面。接下來記錄最近學習的flask連線mysql資料庫,完善使用者登入系統,加入註冊和查詢使用者資訊的功能。
由於初次學習,所寫的程式碼和展示的頁面都比較簡陋,各位大佬就看看圖一樂,發現有錯誤之處請指出。我主要是記錄所學歷程,總結一下,日後好查漏補缺。
一、MySQL資料庫
SQL,結構化查詢語言,Structured Query Language。MySQL則是當前使用最廣泛的開源關係型資料庫,由於有免費的社群版,可供我們進行學習和部署。
1. 準備環境
下載mysql資料庫和workbench,在workbench中新建一個數據庫user_info,新建一個表user。
2. 基本語法
這次的學習主要用到了mysql的查詢資料和增加資料的功能。注意如果用workbench視覺化操作資料,需要先雙擊選中該資料庫。接下來是這次用到的幾個最基本的語句,當然還有很多其他的SQL語句,這些留著日後再說。
# 查詢整個表中的資料,user是表名
select * from user;
# 插入或新增資料
insert into user (username, password) values ("zhangsan", "123456");
#查詢特定欄位的資料
select * from user where name = "zhangsan";
二、程式碼展示
主要有三大塊,第一個是主程式程式碼app.py;第二個是連線資料庫的程式碼db.py;最後是模板檔案templates,裡面有註冊登入所用的hello.html和展示使用者資訊所用的user.html。
1. 主程式app.py
主程式中三個路由分別指向三個函式,分別實現註冊,登入,使用者資訊檢視。
# app.py from flask import Flask, render_template, request, redirect # 這裡把資料庫中的方法全部引入 from db import * app = Flask(__name__) @app.route('/') def home(): return '<h1>Home</h1>' # 註冊函式 @app.route('/register', methods=['POST', 'GET']) def register(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] # write()是資料庫中寫入資料的函式 write(username, password) return "<h1>Success!</h1>" return render_template('hello.html') # 登入函式 @app.route('/login', methods=['POST', 'GET']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] # is_existed()是資料庫中判斷使用者名稱或密碼是否存在的函式 if is_existed(username, password): return redirect('https://www.baidu.com') else: message = 'Incorrect username or password' return render_template('hello.html', message=message) return render_template('hello.html') # 顯示使用者資訊的函式 @app.route('/user', methods=['POST','GET']) def show_user(): # show()是展示使用者資訊的函式 result = show() return render_template("user.html", datas=result) if __name__ == '__main__': app.run()
2. 連線資料庫的程式碼 db.py
此處也有三個函式,同樣對應註冊,登入,資訊展示,同時app.py通過import將這三個方法匯入。
# db.py
import pymysql
# conn = pymysql.connect("資料庫地址", "使用者名稱", "密碼", "資料庫名稱")
conn = pymysql.connect("localhost", "root", "123456", "user_info")
# 直接conn.cursor()返回的是一個二元元組,加入引數"pymysql.cursors.DictCursor"可以返回一個字典形式類似[{},{},{}]
cur = conn.cursor(pymysql.cursors.DictCursor)
# 註冊相關的函式,將使用者輸入的使用者名稱和密碼寫入資料庫
def write(username, password):
sql = f"insert into user (username, password) values ('{username}', '{password}')"
cur.execute(sql)
conn.commit()
# 登入相關的函式,判斷使用者名稱和密碼是否存在
def is_existed(username, password):
# 方法一:全部取出一次判斷
# sql = "select * from user"
# cur.execute(sql)
# result = cur.fetchall()
# for row in result:
# if row[1] == username and row[2] == password:
# return True
# return False
# 方法二:邊取出邊判斷
sql = f"select * from user where username = '{username}' and password = '{password}'"
cur.execute(sql)
result = cur.fetchall()
if len(result) == 0:
return False
return True
# 展示使用者資訊的函式
def show():
sql = "select * from user"
cur.execute(sql)
result = cur.fetchall()
return result
'''注:由於三個函式的操作可能是多次進行,每一個函式結束都不可關閉資料庫,否則進行下一步就會報錯。
但這樣一直不關資料庫會造成資源浪費,可以把連線資料庫的語句寫到函式內部,每次執行完關閉,下一次重新連線。
這樣不知道怎麼樣,多次連線資料庫是否會使效率變低,後期還需學習。'''
3. templates檔案中的程式碼
這裡是兩個html頁面的展示,分別是用來展示使用者註冊和登入的hello.html和顯示使用者資訊的user.html。註冊和登入頁面本應該有所不同,但由於主要探討方法的實現,我就沒有加以區分。
<!--hello.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div style="text-align: center;">
<h1>某某網站</h1>
<!--message引數由app.py傳入,用來顯示錯誤資訊-->
<span style="color: #ff0000;">{% if message %} {{message}} {% endif %}</span>
<form method='post'>
賬號<input type="text" name="username" placeholder="username"/>
<br/>
密碼<input type="password" name="password" placeholder="password"/>
<br/>
<input type="submit" name="submit" value="提交"/>
<input type="reset" value="重置"/>
</form>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>使用者資訊</title>
</head>
<body>
<h1>使用者資訊詳情</h1>
<table border="1px">
<tr>
<th>ID</th>
<th>使用者名稱</th>
<th>密碼</th>
</tr>
<!--這裡的datas是app.py中返回的資料,包含資料庫中所有資訊-->
{% for i in datas %}
<tr>
<!--
由於之前資料庫連線傳入引數 pymysql.cursors.DictCursor,返回結果是一個列表中包含字典的
形式,因此可以通過i["id"]這樣訪問
-->
<td>{{i["id"]}}</td>
<td>{{i["username"]}}</td>
<td>{{i["password"]}}</td>
</tr>
{% endfor %}
</table>
</body>
</html>
三、執行結果
啟動程式app.py,位址列輸入http://127.0.0.1:5000/register,進入如下注冊頁面:
首先資料庫中是隻有一條資料的:
註冊一個lisi,密碼123,點選提交。再次進入workbench:
lisi已被成功加入資料庫中。同樣的方法再新增幾條:
可以看到目前一共四條資料。id部分有跳行是因為我之前刪過一部分資料。接下來輸入http://127.0.0.1:5000/login進行登入,測試均是可以的。如果輸入賬號或密碼錯誤會報錯。
輸入http://127.0.0.1:5000/user,可以看到所有使用者的資訊:
四、總結
通過這次的學習,初步瞭解了mysql和flask的基本使用,但是正如之前所說,目前的成果還是很簡陋的。後期還需深入學習。