1. 程式人生 > 資料庫 >python web學習2-連線資料庫

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的基本使用,但是正如之前所說,目前的成果還是很簡陋的。後期還需深入學習。