用pymysql和Flask搭建后端,響應前端POST和GET請求,實現登錄和注冊功能


前言

這次作業不僅需要我建立一個數據庫(詳情請點擊這里),還需要我基於這個數據庫寫后端接口(注冊和登錄)供前端訪問,接收前端的POST和GET請求,並將登錄、注冊是否成功傳給前端。

本文介紹如何用Flask搭建后端,其中使用了pymysql操作mysql數據庫,也會做這個部分的介紹。

正文

需要為前端提供的接口有兩個:注冊和登錄,為此我定義了四個函數,分別是

  • select_user(userid, password)
  • insert_user(userid, password, phone, email, company)
  • on_register()
  • on_login()

前兩個函數是操作數據庫,被后兩個函數調用;后兩個函數是給前端的接口。

后端說明

整個后端的代碼如下:

from flask import Flask, request
import json
import pymysql
from flask_cors import CORS


# 定義app
app = Flask(__name__)
# 設置跨域
CORS(app, supports_credentials=True)

# 連接數據庫,賬號是root,密碼是000,數據庫名稱是shopdata
db = pymysql.connect("localhost", "root", "000", "shopdata")  # 連接數據庫
cursor = db.cursor()  # 定義游標


# select a user,根據userid和password獲取一個用戶是否存在,即判斷登錄是否成功
def select_user(userid, password):
    # mysql語句
    select_user_sql = 'select * from userinfo where userid="%s" and password="%s";' % (userid, password)
    # 執行mysql語句
    result = cursor.execute(select_user_sql)
    db.commit()
    # 如果返回了一條數據,則登錄成功,否則登錄失敗
    if 1 == result:
        result = True
    else:
        result = False
        print('there is no user where userid="%s and password="%s"!!' % (userid, password))
    return result


# insert a user,根據userid、password等信息,生成一個元組,將其插入數據庫shopdata的userinfo表
def insert_user(userid, password, phone, email, company):
    # mysql語句
    insert_user_sql = 'insert into userinfo(userid, password, phone, email, company)' \
                      'values("%s", "%s", "%s", "%s", "%s");' % (userid, password, phone, email, company)
    # 執行mysql語句,如果插入成功,則注冊成功,否則注冊失敗
    try:
        cursor.execute(insert_user_sql)
        db.commit()
        print('insert user where userid="%s" and password="%s"!!' % (userid, password))
        result = True
    except:
        print('can not insert user where userid="%s" and password="%s"!!' % (userid, password))
        result = False
    finally:
        return result


# on_register,提供給前端的注冊接口
@app.route("/api/register", methods=['POST'])  # 路由,響應POST請求
def on_register():
    # 默認的用戶名和密碼(該用戶不存在且非法)
    userid = ''
    password = ''
    phone = ''
    email = ''
    company = ''
    # 判斷傳入的參數是否為空,並取出前端傳來的參數
    data = request.get_data()
    # print(data)
    if data is not None:
        # 將bytes類型轉化為字典。對應的,前端發過來的內容應該是JSON.stringify(一個對象)
        data = json.loads(data)  # 轉化為字典對象
        # print(data)
        userid = data.get('userid')
        password = data.get('password')
        phone = data.get('phone')
        email = data.get('email')
        company = data.get('company')
    # 判斷參數是否非法。若非法則直接判斷出注冊失敗,若合法則嘗試注冊,再根據數據庫操作結果判斷。
    if len(userid) > 0 and len(password) > 0 and len(phone) > 0 and len(email) > 0 and len(password) > 0:
        return_dict = {'success': insert_user(userid=userid, password=password, phone=phone,
                                              email=email, company=company)}
    else:
        return_dict = {'success': False}
    # 返回結果(結果暫時簡單點,只返回成功或失敗)
    return json.dumps(return_dict)  # 字典轉json


# on_login,提供給前端的登錄接口
@app.route("/api/login", methods=['GET'])  # 路由,響應GET請求
def on_login():
    # 默認的用戶名和密碼(數據庫中不存在該用戶)
    userid = ''
    password = ''
    # 判斷傳入的參數是否為空,獲取前端傳來的參數
    if request.args is not None:
        print(request.args)
        data = request.args.to_dict()
        userid = data.get('userid')
        password = data.get('password')
    # 查詢數據庫
    result = select_user(userid=userid, password=password)
    if not result:
        print('user where userid="%s and password="%s" login!!' % (userid, password))
    # 返回登錄結果(暫時簡單一點,成功或失敗)
    return_dict = {'success': result}
    return json.dumps(return_dict)  # 字典轉json


if __name__ == '__main__':
    # 運行app
    app.run()

    # 程序結束時釋放數據庫資源
    cursor.close()
    db.close()  # 關閉連接

值得注意的是,這里的兩個接口分別響應POST請求和GET請求。

可以發現,兩個接口獲取前端傳過來的參數的方式是不同的:

  • GET

    data = request.args.to_dict()  # 需from flask import request
    

    這樣拿到的data是一個python的字典對象

  • POST

    data = request.get_data()  # 需from flask import request
    data = json.loads(data)  # 轉化為字典對象。需import json
    

    這兩行代碼才拿到一個python的字典對象

接口獲取前端傳過來的參數的方式與其響應的請求類型(如POST、GET、POST和GET)是對應的。

對應地,前端發過來的參數類型也需要和后端進行匹配。

前端代碼

這里給出前端處理用戶登錄和注冊請求的函數。

  • login

    function login() {
        var url = "http://127.0.0.1:5000/api/login";
        var userid = document.getElementById("userid");
        var password = document.getElementById("password");
        $.ajax({
            url: url,
            type: "GET",
            data: {
                userid: userid.value,
                password: password.value,
            },
            success: function(data) {
                var data1 = JSON.parse(data);
                // console.log(data1);
                if (data1.success) {
                    window.sessionStorage.setItem("userid", userid.value);
                    alert("登錄成功!進入主頁面!");
                    window.location.href = 'index.html';
                } else {
                    alert("登錄失敗!請輸入正確的賬號和密碼!");
                }
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                if (textStatus === 'timeout') {
                    alert('請求超時,請重試!');
                }
            }
    
        })
    }
    
  • register

    function register() {
        var password1 = document.getElementById("password1").value;
        var password2 = document.getElementById("password2").value;
        var userid = document.getElementById("userid").value;
        var phone = document.getElementById("phone").value;
        var email = document.getElementById("email").value;
        var company = document.getElementById("company").value;
        if (password1 !== password2) {
            alert("兩次輸入的密碼不相同,請重新輸入!");
            return;
        }
        $.ajax({
            url: "http://127.0.0.1:5000/api/register",
            type: "POST",
            // 轉成json
            data: JSON.stringify({
                userid: userid,
                password: password1,
                phone: phone,
                email: email,
                company: company
            }),
            success: function(data) {
                var data1 = JSON.parse(data);
                if (data1.success) {
                    alert("注冊成功,請登錄!");
                    window.location.href = 'login.html';
                } else {
                    alert("注冊失敗,請檢查您輸入的信息是否正確!");
                }
            },
            error: function(XMLHttpRequest, textStatus, errorThrown) {
                if (textStatus === 'timeout') {
                    alert("請求超時!");
                }
            }
        })
    }
    

可以注意到,用ajax發送GET請求和PSOT請求時,我發的數據類型是不一樣的。

  • login是GET請求,發送了json字符串

    JSON.stringify({
        userid: userid,
        password: password1,
        phone: phone,
        email: email,
        company: company
    })
    
  • register是POST請求,發送了javascript的類的對象

    {
        userid: userid.value,
        password: password.value,
    }
    

至此,本文對這次作業中后端搭建的介紹就結束了。

這次作業算是我第一次寫后端,也是我第一次接觸Flask,如果我有寫錯的地方,請在評論區指正!


作者:@臭咸魚

轉載請注明出處:https://www.cnblogs.com/chouxianyu/

歡迎討論和交流!



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM