PythonWeb全棧開發(fā)項(xiàng)目式教程(慕課版) 課件 項(xiàng)目3、4:“古典文學(xué)網(wǎng)”首頁API接口開發(fā)、“古典文學(xué)網(wǎng)”前端框架解析及開發(fā)_第1頁
PythonWeb全棧開發(fā)項(xiàng)目式教程(慕課版) 課件 項(xiàng)目3、4:“古典文學(xué)網(wǎng)”首頁API接口開發(fā)、“古典文學(xué)網(wǎng)”前端框架解析及開發(fā)_第2頁
PythonWeb全棧開發(fā)項(xiàng)目式教程(慕課版) 課件 項(xiàng)目3、4:“古典文學(xué)網(wǎng)”首頁API接口開發(fā)、“古典文學(xué)網(wǎng)”前端框架解析及開發(fā)_第3頁
PythonWeb全棧開發(fā)項(xiàng)目式教程(慕課版) 課件 項(xiàng)目3、4:“古典文學(xué)網(wǎng)”首頁API接口開發(fā)、“古典文學(xué)網(wǎng)”前端框架解析及開發(fā)_第4頁
PythonWeb全棧開發(fā)項(xiàng)目式教程(慕課版) 課件 項(xiàng)目3、4:“古典文學(xué)網(wǎng)”首頁API接口開發(fā)、“古典文學(xué)網(wǎng)”前端框架解析及開發(fā)_第5頁
已閱讀5頁,還剩226頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

項(xiàng)目3:“古典文學(xué)網(wǎng)”首頁API接口開發(fā)

目錄01.06.拓展任務(wù)02.知識(shí)儲(chǔ)備04.技能拓展項(xiàng)目描述03.項(xiàng)目任務(wù)05.項(xiàng)目總結(jié)

學(xué)習(xí)目標(biāo)知識(shí)目標(biāo):了解RESTfulAPI的核心概念,掌握API接口設(shè)計(jì)的原則與最佳實(shí)踐。了解Jinja2模板的語法及特性,掌握其開發(fā)動(dòng)態(tài)網(wǎng)頁的技能;了解flask-sqlalchemy包的功能與特性,掌握其在項(xiàng)目開發(fā)中的應(yīng)用。能力目標(biāo):通過學(xué)習(xí)RESTfulAPI的設(shè)計(jì)原則,能為“古典文學(xué)網(wǎng)”設(shè)計(jì)符合規(guī)范的API接口;通過學(xué)習(xí)Jinja2模板的相關(guān)知識(shí),能夠運(yùn)用Jinja2來構(gòu)建動(dòng)態(tài)網(wǎng)頁;通過學(xué)習(xí)flask-sqlalchemy的相關(guān)知識(shí),能夠?yàn)轫?xiàng)目開發(fā)數(shù)據(jù)庫(kù)操作模塊。素質(zhì)目標(biāo):培養(yǎng)系統(tǒng)思維,嚴(yán)格遵守行業(yè)規(guī)范和標(biāo)準(zhǔn),提高軟件質(zhì)量和可靠性;培養(yǎng)責(zé)任感、職業(yè)精神和團(tuán)隊(duì)精神,遵守職業(yè)道德。01項(xiàng)目描述

1.項(xiàng)目描述

小白已經(jīng)逐步熟悉了項(xiàng)目的研發(fā)工作,接下來他計(jì)劃為項(xiàng)目開發(fā)數(shù)據(jù)庫(kù)操作模塊,以便更好地與MySQL數(shù)據(jù)庫(kù)進(jìn)行交互。在此基礎(chǔ)上,他還將開發(fā)首頁模塊中的多個(gè)API接口,包括導(dǎo)航欄API接口、搜索API接口以及文學(xué)推薦API接口,并對(duì)注冊(cè)API接口和登錄API接口的進(jìn)一步優(yōu)化,以確保用戶注冊(cè)和登錄流程的順暢與安全。02知識(shí)儲(chǔ)備

2.知識(shí)儲(chǔ)備

為了項(xiàng)目的順利開發(fā),小白需要了解了RESTfulAPI的設(shè)計(jì)原則,并熟悉了Jinja2模板引擎的使用方法,以及如何在Flask框架中執(zhí)行數(shù)據(jù)庫(kù)操作等關(guān)鍵知識(shí)。

2.1.后端API設(shè)計(jì)規(guī)范

下面,我們將探討API開發(fā)中應(yīng)遵循的一些常見規(guī)范,以確保接口設(shè)計(jì)的高效性、易用性和可維護(hù)性。

2.1.后端API設(shè)計(jì)規(guī)范1.接口路徑規(guī)范(1)接口路徑開頭規(guī)范

一個(gè)產(chǎn)品,無論其后端由多少個(gè)服務(wù)構(gòu)成,都應(yīng)當(dāng)只擁有一個(gè)統(tǒng)一的API入口。其URL路徑的接口路徑,通常以“/api”或“/[版本號(hào)]/api”為起始,這有助于確保API的清晰性和一致性。以下便是正確的API設(shè)計(jì)規(guī)范::5000/api/task:5000/v2/api/tasks錯(cuò)誤的API設(shè)計(jì)規(guī)范如下所示::5000/biz/tasks:5000/biz/api/tasks

2.1.后端API設(shè)計(jì)規(guī)范1.接口路徑規(guī)范(2)接口路徑命名規(guī)范

接口路徑應(yīng)遵循統(tǒng)一的命名規(guī)范,即采用“api/aa-bb”的形式進(jìn)行命名。以下是關(guān)于API設(shè)計(jì)的正確規(guī)范:

:5000/api/task-groups錯(cuò)誤的API設(shè)計(jì)規(guī)范如下所示::5000/api/taskGroups在API設(shè)計(jì)中,接口路徑中的資源應(yīng)遵循使用復(fù)數(shù)的原則,而非單數(shù)。以下是關(guān)于API設(shè)計(jì)的正確規(guī)范::5000/api/tasks錯(cuò)誤的API設(shè)計(jì)規(guī)范如下所示::5000/api/task

2.1.后端API設(shè)計(jì)規(guī)范(3)接口需面向通用業(yè)務(wù)

在API設(shè)計(jì)過程中,我們應(yīng)確保接口路徑的命名面向通用業(yè)務(wù)邏輯,而非局限于前端業(yè)務(wù)需求。以獲取篩選表單中任務(wù)字段下拉選項(xiàng)為例,以下是該API設(shè)計(jì)的正確規(guī)范:1.接口路徑規(guī)范:5000/api/tasks錯(cuò)誤的API設(shè)計(jì)規(guī)范如下所示::5000/api/task-select-options

盡管目前這個(gè)接口僅被用于表單的下拉選擇中,我們?nèi)孕杩紤]其未來可能應(yīng)用于各種場(chǎng)景的可能性。因此,我們應(yīng)該以更加通用的方式提供接口,以便客戶端能夠自由組合和靈活使用。這樣的設(shè)計(jì)思路不僅滿足了當(dāng)前的業(yè)務(wù)需求,還為未來的擴(kuò)展和變化預(yù)留了足夠的空間。

2.1.后端API設(shè)計(jì)規(guī)范2.HTTP方法和HTTP狀態(tài)碼規(guī)范

在進(jìn)行API設(shè)計(jì)時(shí),我們需要規(guī)范地使用HTTP方法和HTTP狀態(tài)碼。HTTP方法(如GET、POST、PUT、DELETE等)應(yīng)準(zhǔn)確反映對(duì)資源的操作類型,而HTTP狀態(tài)碼則應(yīng)清晰地傳達(dá)請(qǐng)求的處理結(jié)果。這樣的規(guī)范使用不僅能夠提高API的易用性和一致性,還能幫助客戶端更好地理解和處理響應(yīng)。HTTP方法及HTTP狀態(tài)碼的具體內(nèi)容分別如表所示。HTTP的常見方法方法場(chǎng)景接口示例說明GET獲取數(shù)據(jù)獲取單個(gè)數(shù)據(jù):GET/api/tasks/1、獲取數(shù)據(jù)列表:GET/api/tasksPOST創(chuàng)建數(shù)據(jù)創(chuàng)建單個(gè)數(shù)據(jù):POST/api/tasksPATCH差量修改數(shù)據(jù)差量修改單個(gè)數(shù)據(jù):PATCH/api/tasks/1PUT全量修改數(shù)據(jù)全量修改單個(gè)數(shù)據(jù):PUT/api/tasks/1DELETE刪除數(shù)據(jù)刪除單個(gè)數(shù)據(jù):DELETE/api/tasks/1

2.1.后端API設(shè)計(jì)規(guī)范2.HTTP方法和HTTP狀態(tài)碼規(guī)范HTTP的常見狀態(tài)碼狀態(tài)碼場(chǎng)景200創(chuàng)建成功,通常用在同步操作時(shí)202創(chuàng)建成功,通常用在異步操作時(shí),表示請(qǐng)求已接受,但是還沒有處理完成400參數(shù)錯(cuò)誤,通常用在表單參數(shù)錯(cuò)誤401授權(quán)錯(cuò)誤,通常用在Token缺失或失效,注意401會(huì)觸發(fā)前端跳轉(zhuǎn)到登錄頁403操作被拒絕,通常發(fā)生在權(quán)限不足時(shí),注意此時(shí)務(wù)必帶上詳細(xì)錯(cuò)誤信息404沒有找到對(duì)象,通常發(fā)生在使用錯(cuò)誤的id查詢?cè)斍?00服務(wù)器錯(cuò)誤

2.1.后端API設(shè)計(jì)規(guī)范3.接口請(qǐng)求及響應(yīng)數(shù)據(jù)規(guī)范(1)數(shù)據(jù)傳輸格式規(guī)范

在前后端的數(shù)據(jù)傳輸過程中,我們推薦使用標(biāo)準(zhǔn)的JSON格式。這不僅能提高數(shù)據(jù)的可讀性,還能減少反復(fù)的正反序列化操作,從而提升系統(tǒng)性能。以下是JSON格式數(shù)據(jù)的示例:{code:20000,status:200,message:"請(qǐng)求成功",data:{roles:[{id:1,name:'角色1'},{id:2,name:'角色2'}]}}需要注意的是,API設(shè)計(jì)規(guī)范中規(guī)定返回的是JSON格式數(shù)據(jù)而非JSON字符串。如果返回的是JSON字符串的話,需要額外進(jìn)行字符串到JSON格式的轉(zhuǎn)換工作。

2.1.后端API設(shè)計(jì)規(guī)范(2)請(qǐng)求及響應(yīng)字段命名

在API設(shè)計(jì)中,我們推薦采用“aa_bb_cc”的命名方式,以規(guī)范請(qǐng)求和響應(yīng)字段的命名。這種命名方式有助于提高代碼的可讀性和一致性,使開發(fā)人員能夠更輕松地理解和維護(hù)API接口。以下是關(guān)于API設(shè)計(jì)的正確規(guī)范:3.接口請(qǐng)求及響應(yīng)數(shù)據(jù)規(guī)范{role_ids:[11,12,35],}錯(cuò)誤的API設(shè)計(jì)規(guī)范如下所示:{roleIds:[11,12,35],RoleIds:[11,12,35],ROLE_IDS:[11,12,35]}

2.1.后端API設(shè)計(jì)規(guī)范3.接口請(qǐng)求及響應(yīng)數(shù)據(jù)規(guī)范(3)外層數(shù)據(jù)結(jié)構(gòu)在API設(shè)計(jì)中,當(dāng)需要返回單個(gè)數(shù)據(jù)時(shí),我們通常采用以對(duì)象形式返回?cái)?shù)據(jù)的方式。以下是一個(gè)具體案例:當(dāng)查詢某個(gè)任務(wù)時(shí),API會(huì)返回該任務(wù)的相關(guān)信息,這些信息被封裝在一個(gè)對(duì)象中。以下是該API設(shè)計(jì)的正確規(guī)范:{code:200,status:200,message:"請(qǐng)求成功",data:{id:1,name:'任務(wù)1'}}

2.1.后端API設(shè)計(jì)規(guī)范3.接口請(qǐng)求及響應(yīng)數(shù)據(jù)規(guī)范當(dāng)需要返回多個(gè)數(shù)據(jù)時(shí),我們通常會(huì)選擇以數(shù)組的形式來組織這些數(shù)據(jù)。以下是一個(gè)具體的應(yīng)用場(chǎng)景:當(dāng)查詢某組任務(wù)時(shí),API會(huì)返回一個(gè)包含多個(gè)任務(wù)相關(guān)信息的JSON數(shù)組。以下是該API設(shè)計(jì)的正確規(guī)范:{code:200,status:200,message:"請(qǐng)求成功",data:{items:[{id:1,name:'任務(wù)1'},{id:2,name:'任務(wù)2'}],total:2}}注意:在API設(shè)計(jì)中,當(dāng)需要返回空數(shù)據(jù)集時(shí),我們應(yīng)使用空數(shù)組[]來表示,而非null。

2.1.后端API設(shè)計(jì)規(guī)范4.敏感數(shù)據(jù)規(guī)范

在API設(shè)計(jì)中,對(duì)于涉及用戶隱私的敏感字段,我們應(yīng)進(jìn)行加密處理,以確保數(shù)據(jù)的安全性。以下是關(guān)于API設(shè)計(jì)的正確規(guī)范:{name:'小明',id_number:'U2FsdGVkX1+1fW7OpO/tlPXe4IGA/bXExlhKwIR/spk=',password:'U2FsdGVkX1/AnXKSBDbztNBfp4czlZxQ++3jRtNZhY0=',}錯(cuò)誤的API設(shè)計(jì)規(guī)范如下所示:{name:'小明',id_number:,password:'ming@',}

2.1.后端API設(shè)計(jì)規(guī)范4.敏感數(shù)據(jù)規(guī)范

以上便是API開發(fā)中需遵循的一些常見規(guī)范。在未來的項(xiàng)目開發(fā)過程中,我們將以此為參照,進(jìn)行API接口設(shè)計(jì)。然而,我們也不可一味生搬硬套,而是要根據(jù)項(xiàng)目的實(shí)際需求,靈活而審慎地運(yùn)用這些設(shè)計(jì)規(guī)范,以確保項(xiàng)目開發(fā)的順利進(jìn)行和最終成果的高質(zhì)量。

2.2.Flask的Jinja2模板引擎

在Web應(yīng)用開發(fā)中,為了實(shí)現(xiàn)前后端的解耦并分離前后端邏輯,我們可以將頁面邏輯獨(dú)立出來,交由模板引擎進(jìn)行渲染。鑒于“古典文學(xué)網(wǎng)”項(xiàng)目的前端開發(fā)采用Vue框架,對(duì)于Jinja2模板,我們?cè)诖藘H簡(jiǎn)要介紹其基本的使用方法。

2.2.Flask的Jinja2模板引擎1.Jinja2模板渲染

Flask默認(rèn)采用Jinja2作為其模板引擎,我們通常調(diào)用render_template()函數(shù)來準(zhǔn)確地定位到指定的模板文件,并生成一個(gè)Response對(duì)象。這個(gè)對(duì)象包含了經(jīng)過Jinja2渲染的HTML內(nèi)容,可直接供前端進(jìn)行展示。而模板文件是一個(gè)HTML文件,并存放在Flask應(yīng)用的templates文件夾中,以便于管理和調(diào)用。

下面我們來看一個(gè)簡(jiǎn)單的模板渲染的案例,該案例顯示一段“HelloWorld!”文字,請(qǐng)參考以下步驟完成。

首先,在磁盤中創(chuàng)建一個(gè)名為hi_jinja2的文件夾,并使用VSCode打開它。接下來,請(qǐng)按照以下的目錄結(jié)構(gòu)來構(gòu)建項(xiàng)目目錄架構(gòu)。D:/Projects/hi_jinja2├──templates/│└──index.html├──static/└──app.py

2.2.Flask的Jinja2模板引擎1.Jinja2模板渲染隨后,請(qǐng)打開/templates/index.html模板文件。此文件向客戶展示“Hello

World!”的歡迎語,具體的代碼實(shí)現(xiàn)如下所示:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Index</title></head><body>

<h1>HelloWorld!</h1></body></html>

2.2.Flask的Jinja2模板引擎1.Jinja2模板渲染接下來,在/app.py文件中,定義視圖處理函數(shù)index(),并使用render_template()函數(shù)來渲染模板。這個(gè)函數(shù)會(huì)查找templates文件夾中的模板文件,并返回一個(gè)包含渲染后的HTML的響應(yīng)對(duì)象。這一過程的代碼實(shí)現(xiàn)如下:fromflaskimportFlaskfromflaskimportrender_templateapp=Flask(__name__)@app.route('/')defindex():

returnrender_template("index.html")if__name__=='__main__':app.run()

2.2.Flask的Jinja2模板引擎1.Jinja2模板渲染項(xiàng)目啟動(dòng)后,在瀏覽器中輸入“:5000”進(jìn)行訪問,運(yùn)行效果如圖所示。

2.2.Flask的Jinja2模板引擎2.Jinja2模板的參數(shù)傳遞

在使用Jinja2模板引擎時(shí),我們經(jīng)常需要向模板傳遞參數(shù)。這些參數(shù)可以是變量、列表、字典或任何其他Python數(shù)據(jù)類型。傳遞參數(shù)的主要目的是在模板中動(dòng)態(tài)地展示數(shù)據(jù),或者根據(jù)傳遞的參數(shù)來控制模板的行為。

下面這個(gè)案例展示了如何傳遞更復(fù)雜的數(shù)據(jù)結(jié)構(gòu)(如:列表或字典)到模板中,并顯示傳遞的參數(shù)(請(qǐng)?jiān)谇耙恍」?jié)的hi_jinja2項(xiàng)目中完成),具體操作參考如下步驟。

2.2.Flask的Jinja2模板引擎2.Jinja2模板的參數(shù)傳遞首先,在/app.py源文件中,找到index()視圖函數(shù)。在這個(gè)函數(shù)中,傳遞users列表給模板文件。以下是具體的代碼實(shí)現(xiàn):fromflaskimportFlaskfromflaskimportrender_templateapp=Flask(__name__)@app.route('/')defindex():

users=[{'name':'Alice','age':25},{'name':'Bob','age':30},{'name':'Charlie','age':35}]returnrender_template('index.html',users=users)if__name__=='__main__':app.run()

2.2.Flask的Jinja2模板引擎2.Jinja2模板的參數(shù)傳遞接下來,在/templates/index.html模板文件中,接收并顯示傳遞的users列表。以下是具體的代碼實(shí)現(xiàn):<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Welcome</title></head><body><ul>

{%foruserinusers%}<li>{{}}-{{user.age}}</li>{%endfor%}</ul></body></html>

2.2.Flask的Jinja2模板引擎2.Jinja2模板的參數(shù)傳遞項(xiàng)目啟動(dòng)后,在瀏覽器中輸入“:5000”進(jìn)行訪問,運(yùn)行效果如圖所示。

2.2.Flask的Jinja2模板引擎3.Jinja2模板語法下面是一些Jinja2模板語法的基本元素和常見用法,詳細(xì)的模板語法請(qǐng)參考Jinja2官方文檔。(1)變量在上面的模板中,我們可能注意到了一些不同于HTML原生語法的特殊結(jié)構(gòu):{{var}}。這正是Jinja2模板引擎的語法特性,我們使用雙大括號(hào){{}}來包裹變量,以便在渲染時(shí)輸出其值。以下是一個(gè)示例代碼片段,它用于在模板中輸出name變量的值。<p>Hello,{{name}}!</p>

2.2.Flask的Jinja2模板引擎3.Jinja2模板語法(2)條件語句

如果我們經(jīng)常需要根據(jù)某些條件來執(zhí)行不同的代碼塊,那么可以使用if、elif和else語句來進(jìn)行條件判斷。這些語句允許我們根據(jù)條件的真假來選擇執(zhí)行相應(yīng)的代碼塊,從而實(shí)現(xiàn)更加靈活和精確的邏輯控制。以下示例代碼片段,展示了判斷用戶是否登錄,并輸出提示信息。{%ifuser.is_logged_in%}<p>Welcome,{{}}!</p>{%else%}<p>Pleaselogin.</p>{%endif%}

2.2.Flask的Jinja2模板引擎3.Jinja2模板語法(3)循環(huán)

我們可以使用for循環(huán)來遍歷列表或字典,從而實(shí)現(xiàn)對(duì)集合中每個(gè)元素的迭代處理。這種循環(huán)結(jié)構(gòu)在模板渲染過程中非常有用,可以方便地展示集合中的數(shù)據(jù),并根據(jù)需要進(jìn)行格式化或操作。以下示例展示了在模板中循環(huán)輸出items集合中的數(shù)據(jù)。{%foriteminitems%}<li>{{item}}</li>{%endfor%}</ul>

2.3.Flask的數(shù)據(jù)庫(kù)操作

接下來,我們將詳細(xì)介紹“古典文學(xué)網(wǎng)”項(xiàng)目的數(shù)據(jù)庫(kù)結(jié)構(gòu),并演示如何對(duì)用戶表進(jìn)行常見的數(shù)據(jù)庫(kù)操作,包括增加、刪除、修改和查詢等操作。

2.3.Flask的數(shù)據(jù)庫(kù)操作1.創(chuàng)建項(xiàng)目數(shù)據(jù)庫(kù)(1)“古典文學(xué)網(wǎng)”數(shù)據(jù)庫(kù)首先,我們來介紹一下“古典文學(xué)網(wǎng)”項(xiàng)目的數(shù)據(jù)庫(kù)結(jié)構(gòu),該數(shù)據(jù)庫(kù)將在后續(xù)的開發(fā)中持續(xù)被使用。項(xiàng)目的數(shù)據(jù)庫(kù)名為classicsdb,其中包含6個(gè)表,具體的數(shù)據(jù)庫(kù)表說明參見課本表3.3~3.9。古典文學(xué)網(wǎng)”項(xiàng)目數(shù)據(jù)庫(kù)信息表數(shù)據(jù)庫(kù)名:classicsdb說明:編碼方式為UTF-8序號(hào)數(shù)據(jù)庫(kù)表備注1users用戶表2classictype文學(xué)類型表3classics文學(xué)表4discuss文學(xué)評(píng)論表5classicjudges文學(xué)評(píng)價(jià)表6discusjudges評(píng)論評(píng)價(jià)表說明:具體表結(jié)構(gòu)參考課本

2.3.Flask的數(shù)據(jù)庫(kù)操作1.創(chuàng)建項(xiàng)目數(shù)據(jù)庫(kù)(2)創(chuàng)建“古典文學(xué)網(wǎng)”數(shù)據(jù)庫(kù)

在了解“古典文學(xué)網(wǎng)”項(xiàng)目的數(shù)據(jù)庫(kù)結(jié)構(gòu)之后,我們選用MySQLWorkbench數(shù)據(jù)庫(kù)管理工具,來創(chuàng)建classicsdb數(shù)據(jù)庫(kù)。關(guān)于MySQLWorkbench工具的具體使用方法,可參考本項(xiàng)目的“3.4.1.使用MySQLWorkbench管理數(shù)據(jù)庫(kù)”部分。

我們需要使用MySQLWorkbench成功連接至MySQL數(shù)據(jù)庫(kù)服務(wù),隨后打開了本項(xiàng)目素材中提供的classicsdb.sql數(shù)據(jù)庫(kù)腳本。通過執(zhí)行該腳本,我們順利創(chuàng)建了名為classicsdb的數(shù)據(jù)庫(kù)。創(chuàng)建完成的數(shù)據(jù)庫(kù)見圖所示。

2.3.Flask的數(shù)據(jù)庫(kù)操作2.連接數(shù)據(jù)庫(kù)

為了開發(fā)“古典文學(xué)”項(xiàng)目的數(shù)據(jù)庫(kù)操作模塊,請(qǐng)確保我們已經(jīng)正確安裝了Flask-SQLAlchemy和PyMySQL擴(kuò)展庫(kù)。我們還需要配置數(shù)據(jù)庫(kù)連接的URI,該URI包含了連接數(shù)據(jù)庫(kù)所需的所有關(guān)鍵信息,諸如用戶名、密碼、主機(jī)名、數(shù)據(jù)庫(kù)名,以及一系列用于額外配置的可選關(guān)鍵字參數(shù)等。連接MySQL數(shù)據(jù)庫(kù)的URI的具體格式如下所示:mysql+pymysql://username:password@host:port/database?charset=utf8上述URI格式中的各個(gè)組成部分具有特定的含義,具體如下:lusername:MySQL數(shù)據(jù)庫(kù)用戶名;lpassword:與用戶名對(duì)應(yīng)的密碼;lhost:MySQL服務(wù)器的主機(jī)名或IP地址;lport:MySQL服務(wù)器監(jiān)聽的端口號(hào);ldatabase:連接的數(shù)據(jù)庫(kù)的名稱;lcharset=utf8:這是一個(gè)連接參數(shù),用于指定字符集為utf8。

2.3.Flask的數(shù)據(jù)庫(kù)操作2.連接數(shù)據(jù)庫(kù)接下來,我們將開發(fā)一個(gè)案例,旨在連接“古典文學(xué)網(wǎng)”的classicsdb數(shù)據(jù)庫(kù)。以下是具體的代碼實(shí)現(xiàn):fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)#載入數(shù)據(jù)庫(kù)配置#MySql連接的URIapp.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#記錄所有發(fā)送到標(biāo)準(zhǔn)輸出的SQL語句,通常在開發(fā)調(diào)試時(shí)很有幫助。app.config['SQLALCHEMY_ECHO']=True

#創(chuàng)建數(shù)據(jù)庫(kù)的操作對(duì)象db=SQLAlchemy(app)if__name__=="__main__":app.run()在上述代碼中,我們首先對(duì)SQLALCHEMY_DATABASE_URI和SQLALCHEMY_ECHO進(jìn)行了配置,以便指定數(shù)據(jù)庫(kù)的連接信息和是否開啟SQLAlchemy的日志輸出。隨后,通過調(diào)用SQLAlchemy(app)語句,我們成功創(chuàng)建了數(shù)據(jù)庫(kù)操作對(duì)象db。

2.3.Flask的數(shù)據(jù)庫(kù)操作3.構(gòu)建模型類

在使用Flask-SQLAlchemy進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),我們必須定義與數(shù)據(jù)庫(kù)相對(duì)應(yīng)的模型類。這些模型類均繼承自db.Model,用于描述數(shù)據(jù)庫(kù)表的結(jié)構(gòu)和字段。通常情況下,這些模型類會(huì)被保存在models.py文件中,以便于管理和維護(hù)。通過定義這些模型類,我們可以方便地實(shí)現(xiàn)與數(shù)據(jù)庫(kù)的交互,包括數(shù)據(jù)的增刪改查等操作。

2.3.Flask的數(shù)據(jù)庫(kù)操作3.構(gòu)建模型類接下來,我們將定義與“古典文學(xué)網(wǎng)”數(shù)據(jù)庫(kù)中users表相對(duì)應(yīng)的模型類。以下是具體的代碼實(shí)現(xiàn):classUsers(db.Model):__tablename__='users'__table_args__={'comment':'用戶表'}uid:Mapped[int]=mapped_column(Integer,primary_key=True,comment='用戶編號(hào)')uname:Mapped[str]=mapped_column(VARCHAR(100),comment='登錄賬號(hào)')upwd:Mapped[str]=mapped_column(VARCHAR(100),comment='登錄密碼')nickname:Mapped[Optional[str]]=mapped_column(VARCHAR(100),comment='昵稱')avatar:Mapped[Optional[str]]=mapped_column(VARCHAR(200),comment='頭像')sex:Mapped[Optional[str]]=mapped_column(VARCHAR(50),comment='性別')phone:Mapped[Optional[str]]=mapped_column(VARCHAR(50),comment='電話')remark:Mapped[Optional[str]]=mapped_column(VARCHAR(200),comment='備注')

2.3.Flask的數(shù)據(jù)庫(kù)操作3.構(gòu)建模型類在上述代碼中,我們定義了一個(gè)名為Users的類,它借助__tablename__屬性與數(shù)據(jù)庫(kù)中的users表建立了關(guān)聯(lián)。同時(shí),我們定義了uid、uname等屬性,它們與users表中的相應(yīng)字段一一對(duì)應(yīng)。通過Users類,我們可以輕松地對(duì)users數(shù)據(jù)庫(kù)表執(zhí)行增刪改查等操作。在項(xiàng)目開發(fā)中,我們會(huì)使用flask-marshmallow和marshmallow-sqlalchemy擴(kuò)展,它們主要用于將復(fù)雜的數(shù)據(jù)類型(如SQLAlchemy模型)轉(zhuǎn)換為JSON格式,以及從JSON轉(zhuǎn)換回Python對(duì)象。在開始構(gòu)建模型類之前,請(qǐng)確保我們已經(jīng)正確安裝了flask-marshmallow和marshmallow-sqlalchemy擴(kuò)展庫(kù)。在使用flask-marshmallow擴(kuò)展庫(kù)時(shí),我們首先需要執(zhí)行以下代碼來進(jìn)行初始化操作。#初始化Marshmallowma=Marshmallow(app)

2.3.Flask的數(shù)據(jù)庫(kù)操作3.構(gòu)建模型類接下來,我們將定義與Users模型類相對(duì)應(yīng)的Schema類。這個(gè)Schema類的主要作用是將Users模型類的數(shù)據(jù)轉(zhuǎn)換為JSON格式,以便在前后端交互中更便捷地處理數(shù)據(jù)。以下是Users轉(zhuǎn)化類具體的代碼實(shí)現(xiàn),它展示了如何構(gòu)建這樣一個(gè)轉(zhuǎn)換類。#使用flask-marshmallow自動(dòng)生成schema

classUsersSchema(ma.SQLAlchemyAutoSchema):

classMeta:

model=Users

#序列化的字段

fields=("uid","uname","upwd","nickname","avatar","sex","phone","remark")在上述代碼中,我們定義了一個(gè)名為UsersSchema的轉(zhuǎn)換類。通過model字段,我們將其與Users模型類進(jìn)行了關(guān)聯(lián),從而確保它能夠準(zhǔn)確地轉(zhuǎn)換Users模型類的數(shù)據(jù)。同時(shí),利用fields字段,我們明確指定了需要序列化的Users模型類的屬性,以便在轉(zhuǎn)換過程中只包含所需的信息。

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作

接下來,我們將以Users模型類為例,詳細(xì)介紹如何使用Flask-SQLAlchemy擴(kuò)展庫(kù)的API進(jìn)行數(shù)據(jù)庫(kù)操作。(1)增加數(shù)據(jù)

在Flask-SQLAlchemy擴(kuò)展庫(kù)中,增加數(shù)據(jù)主要是通過創(chuàng)建模型類的實(shí)例,并將其添加到數(shù)據(jù)庫(kù)會(huì)話中,最后提交會(huì)話來完成的。會(huì)話(session)提供了增加數(shù)據(jù)的add()和add_all()方法,其中add()方法用于向數(shù)據(jù)庫(kù)中增加一條記錄,add_all()方法用于向數(shù)據(jù)庫(kù)中增加多條記錄。

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作

接下來,我們將以上一節(jié)中定義的Users模型類為例,開發(fā)一個(gè)增加用戶的API接口,演示如何向數(shù)據(jù)庫(kù)中增加用戶數(shù)據(jù)。以下是部分的實(shí)現(xiàn)代碼(具體代碼參考課本):fromflaskimportFlask,jsonify…………app=Flask(__name__)#載入數(shù)據(jù)庫(kù)配置#MySql連接的URIapp.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#

記錄所有發(fā)送到標(biāo)準(zhǔn)輸出的SQL語句,通常在開發(fā)調(diào)試時(shí)很有幫助。app.config['SQLALCHEMY_ECHO']=True

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作

接上頁代碼#創(chuàng)建數(shù)據(jù)庫(kù)的操作對(duì)象db=SQLAlchemy(app)#初始化Marshmallowma=Marshmallow(app)#1.增加用戶數(shù)據(jù)@app.route('/add')defadd_user():

#新建用戶對(duì)象user1=Users(uname='xiaoming',upwd='123456',nickname='小明',avatar='xm.jpg',……

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作在上述代碼中,我們?cè)赼dd_user()視圖函數(shù)中,通過add()和add_all()方法,成功地向數(shù)據(jù)庫(kù)中添加了三條用戶數(shù)據(jù)。項(xiàng)目啟動(dòng)后,可以通過“:5000/add”進(jìn)行訪問,在數(shù)據(jù)庫(kù)的users數(shù)據(jù)表可以看到增加的用戶數(shù)據(jù),如圖所示。

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作

(2)查詢數(shù)據(jù)Flask-SQLAlchemy擴(kuò)展庫(kù)提供了query屬性,這個(gè)屬性是一個(gè)功能強(qiáng)大的查詢構(gòu)造器。當(dāng)我們?cè)L問這個(gè)屬性時(shí),會(huì)得到一個(gè)新的查詢對(duì)象,該對(duì)象提供了豐富的過濾器和查詢方法,使我們能夠?qū)Σ樵兘Y(jié)果進(jìn)行精確的過濾和篩選。查詢數(shù)據(jù)的語法格式如下所示:模型類.query.<過濾器>.<查詢方法>

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作

(2)查詢數(shù)據(jù)在上述格式中,過濾器和查詢方法是可選的,使用過濾器會(huì)返回一個(gè)新的查詢對(duì)象,過濾和查詢方法可以疊加使用,也可單獨(dú)使用。查詢對(duì)象的過濾器和查詢方法分別見表

常用的SQLAlchemy查詢過濾器過濾器說明filter把過濾器添加到原查詢上,返回一個(gè)新查詢filter_by把等值過濾器添加到原查詢上,返回一個(gè)新查詢limit使用指定的值限定原查詢返回的結(jié)果offset偏移原查詢返回的結(jié)果,返回一個(gè)新查詢order_by根據(jù)指定條件對(duì)原查詢結(jié)果進(jìn)行排序,返回一個(gè)新查詢group_by根據(jù)指定條件對(duì)原查詢結(jié)果進(jìn)行分組,返回一個(gè)新查詢

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作

(2)查詢數(shù)據(jù)在上述格式中,過濾器和查詢方法是可選的,使用過濾器會(huì)返回一個(gè)新的查詢對(duì)象,過濾和查詢方法可以疊加使用,也可單獨(dú)使用。查詢對(duì)象的過濾器和查詢方法分別見表

常用的SQLAlchemy查詢方法方法說明all()以列表形式返回查詢的所有結(jié)果first()返回查詢的第一個(gè)結(jié)果,如果未查到,返回Nonefirst_or_404()返回查詢的第一個(gè)結(jié)果,如果未查到,返回404get()返回指定主鍵對(duì)應(yīng)的行,如不存在,返回Noneget_or_404()返回指定主鍵對(duì)應(yīng)的行,如不存在,返回404count()返回查詢結(jié)果的數(shù)量paginate()返回一個(gè)Paginate對(duì)象,它包含指定范圍內(nèi)的結(jié)果

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作接下來,我們將展示一些針對(duì)users表的常用查詢案例,演示如何進(jìn)行數(shù)據(jù)的查詢操作。常見的查詢操作的部分代碼如下所示(具體代碼參考課本):#簡(jiǎn)單查詢users=Users.query.all()#查詢所有用戶數(shù)據(jù)count=Users.query.count()#查詢有多少個(gè)用戶user=Users.query.first()#查詢第1個(gè)用戶

#根據(jù)uid查詢

返回模型對(duì)象/Noneuser=Users.query.get(5)users=Users.query.filter_by(uid=5).all()user=Users.query.filter(Users.uid==5).first()

#查詢昵稱以某個(gè)字符開始/結(jié)尾/包含的所有用戶users=Users.query.filter(Users.nickname.endswith("g")).all()users=Users.query.filter(Users.nickname.startswith("w")).all()

…………

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作接下來,我們將展示一些針對(duì)users表的常用查詢案例,演示如何進(jìn)行數(shù)據(jù)的查詢操作。常見的查詢操作的部分代碼如下所示(具體代碼參考課本):#簡(jiǎn)單查詢users=Users.query.all()#查詢所有用戶數(shù)據(jù)count=Users.query.count()#查詢有多少個(gè)用戶user=Users.query.first()#查詢第1個(gè)用戶

#根據(jù)uid查詢

返回模型對(duì)象/Noneuser=Users.query.get(5)users=Users.query.filter_by(uid=5).all()user=Users.query.filter(Users.uid==5).first()

#查詢昵稱以某個(gè)字符開始/結(jié)尾/包含的所有用戶users=Users.query.filter(Users.nickname.endswith("g")).all()users=Users.query.filter(Users.nickname.startswith("w")).all()

…………

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作項(xiàng)目啟動(dòng)后,可以通過“:5000/search”進(jìn)行訪問,測(cè)試結(jié)果如圖3.5所示。

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作(3)更新數(shù)據(jù)更新數(shù)據(jù)的過程相對(duì)直觀且簡(jiǎn)便。我們只需為模型類的相關(guān)字段重新賦值,即可實(shí)現(xiàn)對(duì)原有字段值的修改。完成修改后,為確保更改生效,需要調(diào)用commit()方法,將數(shù)據(jù)變更提交至數(shù)據(jù)庫(kù)中進(jìn)行保存。接下來,我們開發(fā)一個(gè)修改用戶的API接口(基于上一小節(jié)的案例中完成),修改用戶編號(hào)(uid字段)為2的用戶的昵稱(nickname字段),具體代碼如下所示:#3.更新用戶數(shù)據(jù)@app.route('/update')defupdate_user():#返回主鍵為2的對(duì)應(yīng)用戶user=Users.query.get(2)#修改用戶昵稱user.nickname='李白'

#提交會(huì)話以保存更改

mit()

returnjsonify({"code":200,"msg":"操作成功"})

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作在上述代碼中,我們首先查詢了編號(hào)為2的用戶,然后將其昵稱修改為“李白”,并通過提交到數(shù)據(jù)庫(kù)的方式完成了用戶數(shù)據(jù)的更新操作。項(xiàng)目啟動(dòng)后,可以通過“:5000/update”進(jìn)行訪問,在數(shù)據(jù)庫(kù)的users數(shù)據(jù)表可以看到修改后的用戶數(shù)據(jù),如圖所示。

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作(4)刪除數(shù)據(jù)當(dāng)我們需要從數(shù)據(jù)庫(kù)表中刪除一個(gè)或多個(gè)不再需要的記錄時(shí),只需簡(jiǎn)單地調(diào)用delete()方法,即可輕松實(shí)現(xiàn)數(shù)據(jù)的刪除操作。接下來,我們開發(fā)一個(gè)刪除用戶信息的API接口(基于上一小節(jié)的案例中完成),刪除用戶編號(hào)(uid字段)為9的用戶,具體代碼如下所示:#4.刪除用戶數(shù)據(jù)@app.route('/delete')defdelete_user():#返回主鍵為9的對(duì)應(yīng)用戶user=Users.query.get(9)#刪除用戶數(shù)據(jù)db.session.delete(user)#提交會(huì)話以保存更改mit()returnjsonify({"code":200,"msg":"操作成功"})

2.3.Flask的數(shù)據(jù)庫(kù)操作4.數(shù)據(jù)庫(kù)操作在上述代碼中,我們首先查詢了編號(hào)為9的用戶,然后使用delete()方法將其刪除,最后提交到數(shù)據(jù)庫(kù),完成了用戶數(shù)據(jù)的刪除操作。項(xiàng)目啟動(dòng)后,可以通過“:5000/delete”進(jìn)行訪問,在數(shù)據(jù)庫(kù)的users數(shù)據(jù)表可以看到編號(hào)為9的用戶被刪除了,如圖所示。03項(xiàng)目任務(wù)

3.項(xiàng)目任務(wù)

在這一階段,小白將開發(fā)“古典文學(xué)網(wǎng)”項(xiàng)目的數(shù)據(jù)操作模塊,并完成首頁模塊文學(xué)導(dǎo)航API接口、文學(xué)推薦API接口、文學(xué)搜索API接口、輪播圖API接口的開發(fā)工作及進(jìn)一步完善用戶注冊(cè)與登錄的API接口功能。

3.1.開發(fā)項(xiàng)目的數(shù)據(jù)操作模塊1.需求描述

在本次任務(wù)中,我們將為“古典文學(xué)網(wǎng)”的后端項(xiàng)目開發(fā)數(shù)據(jù)庫(kù)操作模塊。首先,我們需要在“古典文學(xué)網(wǎng)”后端項(xiàng)目中進(jìn)行數(shù)據(jù)庫(kù)配置工作,確保數(shù)據(jù)庫(kù)的穩(wěn)定運(yùn)行與高效性能。隨后,我們將開發(fā)后端項(xiàng)目的數(shù)據(jù)操作模塊,使項(xiàng)目能夠正常、順暢地訪問數(shù)據(jù)庫(kù)。

3.1.開發(fā)項(xiàng)目的數(shù)據(jù)操作模塊2.業(yè)務(wù)功能實(shí)現(xiàn)(1)配置數(shù)據(jù)庫(kù)連接

在后端“cls_svr”項(xiàng)目的app/conf/目錄下,我們需要?jiǎng)?chuàng)建一個(gè)名為dbconfig.py的數(shù)據(jù)庫(kù)配置文件。在該文件中,我們將配置數(shù)據(jù)庫(kù)的連接信息。請(qǐng)確保項(xiàng)目數(shù)據(jù)庫(kù)classicsdb已經(jīng)正確創(chuàng)建(參照3.2.3.小節(jié)中創(chuàng)建數(shù)據(jù)庫(kù)的操作)。以下是dbconfig.py配置文件的代碼實(shí)現(xiàn):#------MySQL數(shù)據(jù)庫(kù)配置------#MySql連接的URISQLALCHEMY_DATABASE_URI='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#記錄所有發(fā)送到標(biāo)準(zhǔn)輸出的SQL語句,通常在開發(fā)調(diào)試時(shí)很有幫助。SQLALCHEMY_ECHO=True

上述代碼中,我們配置了項(xiàng)目的數(shù)據(jù)庫(kù)訪問信息,其中classicsdb為古典文學(xué)網(wǎng)的數(shù)據(jù)庫(kù)名稱。

3.1.開發(fā)項(xiàng)目的數(shù)據(jù)操作模塊2.業(yè)務(wù)功能實(shí)現(xiàn)(1)配置數(shù)據(jù)庫(kù)連接

在后端“cls_svr”項(xiàng)目的app/conf/目錄下,我們需要?jiǎng)?chuàng)建一個(gè)名為dbconfig.py的數(shù)據(jù)庫(kù)配置文件。在該文件中,我們將配置數(shù)據(jù)庫(kù)的連接信息。請(qǐng)確保項(xiàng)目數(shù)據(jù)庫(kù)classicsdb已經(jīng)正確創(chuàng)建(參照3.2.3.小節(jié)中創(chuàng)建數(shù)據(jù)庫(kù)的操作)。以下是dbconfig.py配置文件的代碼實(shí)現(xiàn):#------MySQL數(shù)據(jù)庫(kù)配置------#MySql連接的URISQLALCHEMY_DATABASE_URI='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#記錄所有發(fā)送到標(biāo)準(zhǔn)輸出的SQL語句,通常在開發(fā)調(diào)試時(shí)很有幫助。SQLALCHEMY_ECHO=True

上述代碼中,我們配置了項(xiàng)目的數(shù)據(jù)庫(kù)訪問信息,其中classicsdb為古典文學(xué)網(wǎng)的數(shù)據(jù)庫(kù)名稱。

3.1.開發(fā)項(xiàng)目的數(shù)據(jù)操作模塊(2)開發(fā)項(xiàng)目數(shù)據(jù)操作框架

接下來,我們需要在項(xiàng)目中加載數(shù)據(jù)庫(kù)配置信息,并構(gòu)建完整的數(shù)據(jù)庫(kù)操作框架。首先,我們需要定位到項(xiàng)目中的app/__init__.py文件。在此文件中,我們將加載數(shù)據(jù)庫(kù)配置并創(chuàng)建數(shù)據(jù)庫(kù)操作對(duì)象,以便后續(xù)能夠順利執(zhí)行數(shù)據(jù)庫(kù)操作。以下是關(guān)鍵代碼的具體實(shí)現(xiàn):......fromapp.conf.dbconfigimportSQLALCHEMY_DATABASE_URIfromapp.conf.dbconfigimportSQLALCHEMY_ECHOfromflask_sqlalchemyimportSQLAlchemyfromflask_marshmallowimportMarshmallow......db=SQLAlchemy()#創(chuàng)建數(shù)據(jù)庫(kù)的操作對(duì)象ma=Marshmallow()#初始化Marshmallow

2.業(yè)務(wù)功能實(shí)現(xiàn)

3.1.開發(fā)項(xiàng)目的數(shù)據(jù)操作模塊接上頁代碼defcreate_app():

......

#載入數(shù)據(jù)庫(kù)配置

app.config['SQLALCHEMY_DATABASE_URI']=SQLALCHEMY_DATABASE_URIapp.config['SQLALCHEMY_ECHO']=SQLALCHEMY_ECHO

#數(shù)據(jù)庫(kù)操作對(duì)象綁定app

db.init_app(app)

ma.init_app(app)

......

returnapp

2.業(yè)務(wù)功能實(shí)現(xiàn)在上述代碼中,我們導(dǎo)入dbconfig.py中的數(shù)據(jù)庫(kù)配置信息,并將配置參數(shù)加載到Flask實(shí)例中。隨后,我們創(chuàng)建了數(shù)據(jù)庫(kù)操作對(duì)象db和模型類轉(zhuǎn)換對(duì)象ma,并調(diào)用init_app(app)方法完成了初始化操作。

3.1.開發(fā)項(xiàng)目的數(shù)據(jù)操作模塊(3)構(gòu)建項(xiàng)目模型類

我們接下來需要為“古典文學(xué)網(wǎng)”項(xiàng)目創(chuàng)建數(shù)據(jù)庫(kù)模型類。我們需要找到本項(xiàng)目素材中的數(shù)據(jù)庫(kù)模型文件models.py,將models.py復(fù)制到“cls_svr”項(xiàng)目的app/model/目錄下,以便項(xiàng)目能夠正確識(shí)別并使用這些模型類。以下是models.py代碼片段。2.業(yè)務(wù)功能實(shí)現(xiàn)fromtypingimportList,Optional…………#導(dǎo)入數(shù)據(jù)庫(kù)操作對(duì)象fromappimportdbfromappimportmaclassClassictype(db.Model):__tablename__='classictype'

__table_args__={'comment':'古典文學(xué)類型表'}tid:Mapped[int]=mapped_column(Integer,primary_key=True)…………對(duì)應(yīng)上述模型類,建議直接使用本項(xiàng)目素材提供的數(shù)據(jù)庫(kù)模型類文件models.py

3.2.完善用戶注冊(cè)API接口

在前面的開發(fā)中,我們已經(jīng)成功開發(fā)了用戶的注冊(cè)API接口。然而,該接口目前尚未包含數(shù)據(jù)庫(kù)操作模塊。接下來,我們將為該接口加入數(shù)據(jù)庫(kù)操作功能。

3.2.完善用戶注冊(cè)API接口1.需求描述

請(qǐng)?jiān)诤蠖恕癱ls_svr”項(xiàng)目的基礎(chǔ)上,擴(kuò)展用戶注冊(cè)API接口的功能,為其加入了數(shù)據(jù)庫(kù)操作模塊,該模塊的主要作用是將用戶的注冊(cè)數(shù)據(jù)插入到用戶表(users)中。通過這一改進(jìn),我們成功完成了整個(gè)用戶注冊(cè)API接口功能的開發(fā),為用戶提供了更加便捷、高效的注冊(cè)體驗(yàn)。

3.2.完善用戶注冊(cè)API接口2.業(yè)務(wù)功能實(shí)現(xiàn)接下來,我們將著手完善用戶注冊(cè)API接口。以下是具體的開發(fā)步驟。(1)開發(fā)數(shù)據(jù)操作模塊在“cls_svr”項(xiàng)目的app/dao/目錄下創(chuàng)建用戶數(shù)據(jù)庫(kù)操作模塊文件UsersDao.py,并開發(fā)增加用戶的功能,具體代碼如下所示:fromappimportdbfromapp.model.modelsimportUsers#數(shù)據(jù)庫(kù)操作類classUsersDao:def__init__(self):print("UsersDaoisruning")

3.2.完善用戶注冊(cè)API接口2.業(yè)務(wù)功能實(shí)現(xiàn)接上頁代碼:#1.增加一個(gè)用戶defaddUser(self,user):flag=True#成功標(biāo)志,True操作成功,F(xiàn)alse操作失敗try:db.session.add(user)mit()#提交至數(shù)據(jù)庫(kù)exceptExceptionase:flag=Falsedb.session.rollback()#異常,回滾數(shù)據(jù)庫(kù)passreturnflag在上述代碼中,我們創(chuàng)建了一個(gè)名為UsersDao的數(shù)據(jù)庫(kù)操作類。在UsersDao類中,我們定義了一個(gè)addUser(self,user)函數(shù),該函數(shù)接收一個(gè)user參數(shù),即用戶對(duì)象,用于將新用戶信息添加到數(shù)據(jù)庫(kù)表(users)中。該方法執(zhí)行后會(huì)返回一個(gè)名為flag的變量,當(dāng)flag的值為True時(shí),表示用戶添加操作已成功完成;若flag的值為False,則意味著添加操作未能成功執(zhí)行。

3.2.完善用戶注冊(cè)API接口2.業(yè)務(wù)功能實(shí)現(xiàn)(2)完善用戶注冊(cè)邏輯

在“cls_svr”項(xiàng)目的app/api/user_blueprint.py文件中,我們需要找到用戶注冊(cè)的視圖函數(shù)register()。在該函數(shù)內(nèi)部,我們需要增加數(shù)據(jù)庫(kù)操作邏輯代碼,以便在用戶注冊(cè)時(shí)能夠?qū)⑾嚓P(guān)信息正確存儲(chǔ)到數(shù)據(jù)庫(kù)中。以下是關(guān)鍵代碼實(shí)現(xiàn):......#引入數(shù)據(jù)庫(kù)操作對(duì)象fromapp.dao.UsersDaoimportUsersDaofromapp.model.modelsimportUsers#用戶注冊(cè)接口@user_blueprint.route('/register',methods=["POST"])defregister():

......#注冊(cè)用戶,創(chuàng)建數(shù)據(jù)庫(kù)操作對(duì)象

db_op=UsersDao()

3.2.完善用戶注冊(cè)API接口2.業(yè)務(wù)功能實(shí)現(xiàn)接上頁代碼:#新建用戶對(duì)象

user=Users(uname=uname,upwd=upwd,nickname=nickname,avatar=avatar,sex=sex,phone=phone)

flag=db_op.addUser(user) #增加用戶

ifflag:

result_msg["code"]="200"

result_msg["msg"]="操作成功!"

else:

result_msg["code"]="404"

result_msg["msg"]="操作失??!"

#返回操作結(jié)果

returnjsonify(result_msg)......在上述代碼中,我們成功導(dǎo)入了用戶的數(shù)據(jù)庫(kù)操作類UsersDao,并借助其提供的addUser()函數(shù),將用戶信息添加至用戶表(users)中,從而實(shí)現(xiàn)了用戶的注冊(cè)功能。

3.2.完善用戶注冊(cè)API接口2.業(yè)務(wù)功能實(shí)現(xiàn)(3)用戶注冊(cè)API接口測(cè)試項(xiàng)目啟動(dòng)后,可以通過“:5000/api/user/register”進(jìn)行訪問,測(cè)試結(jié)果如圖所示。

3.3.完善用戶登錄API接口

在前面的開發(fā)中,我們已經(jīng)成功開發(fā)了用戶的登錄API接口。然而,該接口目前尚未包含數(shù)據(jù)庫(kù)操作模塊。接下來,我們將為該接口加入數(shù)據(jù)庫(kù)操作功能。

3.3.完善用戶登錄API接口1.需求描述

請(qǐng)?jiān)诤蠖恕癱ls_svr”項(xiàng)目的基礎(chǔ)上,擴(kuò)展用戶登錄API接口的功能,為其加入了數(shù)據(jù)庫(kù)操作模塊。該模塊的主要作用是查詢登錄用戶是否在用戶表(users)中。通過這一改進(jìn),我們成功完成了用戶登錄API接口功能的開發(fā),為用戶提供了更加便捷、高效的登錄體驗(yàn)。

3.3.完善用戶登錄API接口2.業(yè)務(wù)功能實(shí)現(xiàn)接下來,我們將著手完善用戶登錄API接口。以下是具體的開發(fā)步驟。(1)開發(fā)數(shù)據(jù)操作模塊

在“cls_svr”項(xiàng)目中,找到“app/dao/UsersDao.py”文件,在該文件中,開發(fā)用戶登錄查詢的功能,具體關(guān)鍵代碼如下所示:

3.3.完善用戶登錄API接口2.業(yè)務(wù)功能實(shí)現(xiàn)......#2.通過賬號(hào)及密碼查詢用戶defgetUserByLogin(self,uname,upwd):try:#查詢user=Users.query.filter(Users.uname==uname,Users.upwd==upwd).first()returnuserexceptExceptionase:print(e)pass......在上述代碼中,我們定義了一個(gè)名為getUserByLogin(self,uname,upwd)的函數(shù),它接受兩個(gè)參數(shù):uname和upwd,分別代表用戶的賬號(hào)和密碼。隨后,該函數(shù)會(huì)利用這些賬號(hào)和密碼信息在用戶數(shù)據(jù)庫(kù)表(users)中進(jìn)行查詢,以驗(yàn)證用戶是否存在。

3.3.完善用戶登錄API接口2.業(yè)務(wù)功能實(shí)現(xiàn)(2)開發(fā)用戶登錄邏輯

在“cls_svr”項(xiàng)目的app/api/user_blueprint.py文件中,我們找到用戶登錄的視圖函數(shù)login()。在該函數(shù)內(nèi)部,我們需要增加數(shù)據(jù)庫(kù)操作邏輯代碼,以便驗(yàn)證用戶是否存在。以下是關(guān)鍵代碼實(shí)現(xiàn):......#用戶登錄接口@user_blueprint.route('/login',methods=["POST"])deflogin():

#返回信息

result_msg={"code":"200","msg":"操作成功!"}......#進(jìn)行登錄,創(chuàng)建數(shù)據(jù)庫(kù)操作對(duì)象

db_op=UsersTypeDao()

#進(jìn)行登錄操作

user=db_op.getUserByLogin(uname,upwd)#判斷是否登錄成功

ifuserisnotNone:

......在上述代碼中,我們?cè)诘卿浺晥D函數(shù)login()中調(diào)用getUserByLogin()函數(shù),該函數(shù)根據(jù)賬號(hào)和密碼信息進(jìn)行驗(yàn)證,并把驗(yàn)證結(jié)果返回給客戶端,從而完成了整個(gè)登錄流程。

3.3.完善用戶登錄API接口2.業(yè)務(wù)功能實(shí)現(xiàn)(3)用戶登錄API接口測(cè)試項(xiàng)目啟動(dòng)后,可以通過“:5000/api/user/login”進(jìn)行訪問,測(cè)試結(jié)果如圖所示。

3.4.開發(fā)文學(xué)導(dǎo)航API接口接下來,我們著手開發(fā)“首頁”文學(xué)導(dǎo)航API接口。

3.4.開發(fā)文學(xué)導(dǎo)航API接口1.需求描述“首頁”文學(xué)導(dǎo)航API接口的主要功能是初始化首頁的導(dǎo)航欄。在接口被調(diào)用時(shí),它會(huì)從數(shù)據(jù)庫(kù)中查詢出所有的文學(xué)類型,并將這些信息以導(dǎo)航欄的形式在首頁上呈現(xiàn)給用戶。這一過程中,接口需要訪問數(shù)據(jù)庫(kù)中的文學(xué)類型表(classictype),并將查詢到的文學(xué)類型信息返回給客戶端,以便客戶端能夠正確地展示這些導(dǎo)航項(xiàng)。該API接口的詳細(xì)說明,請(qǐng)參見課本表3.12。

3.4.開發(fā)文學(xué)導(dǎo)航API接口2.業(yè)務(wù)功能實(shí)現(xiàn)

接下來,我們將著手開發(fā)“首頁”文學(xué)導(dǎo)航API接口。以下是具體的開發(fā)步驟。

3.4.開發(fā)文學(xué)導(dǎo)航API接口2.業(yè)務(wù)功能實(shí)現(xiàn)(1)開發(fā)數(shù)據(jù)操作模塊在“cls_svr”項(xiàng)目的app/dao/目錄下創(chuàng)建文學(xué)數(shù)據(jù)庫(kù)操作模塊ClassicsDao.py,并開發(fā)查詢文學(xué)類型的功能,具體代碼如下所示:fromappimportdbfromapp.model.modelsimportClassictype,Classics#數(shù)據(jù)庫(kù)操作類classClassicsDao:def__init__(self):print("ClassicsDaoisruning")#1.獲取文學(xué)類型列表defgetClassictypes(self):try:#獲取所有文學(xué)類型

classictypes=Classictype.query.all()returnclassictypesexceptExceptionase:print(e)pass在上述代碼中,創(chuàng)建了一個(gè)名為ClassicsDao的數(shù)據(jù)庫(kù)操作類,該類負(fù)責(zé)處理與數(shù)據(jù)庫(kù)相關(guān)的文學(xué)操作。在ClassicsDao類中,我們定義了一個(gè)getClassictypes()函數(shù),該函數(shù)用于查詢文學(xué)類型表(classictype)的數(shù)據(jù),并以列表的形式返回。

3.4.開發(fā)文學(xué)導(dǎo)航API接口2.業(yè)務(wù)功能實(shí)現(xiàn)(2)創(chuàng)建文學(xué)藍(lán)圖在“cls_svr”項(xiàng)目的app/api/目錄下創(chuàng)建文學(xué)藍(lán)圖classics_blueprint.py,用以獲取文學(xué)類型數(shù)據(jù),具體代碼如下所示:fromflaskimportBlueprint,requestfromflaskimportjsonify#引入數(shù)據(jù)庫(kù)操作對(duì)象fromapp.dao.ClassicsDaoimportClassicsDaofromapp.model.modelsimportClassictype,ClassictypeSchema#創(chuàng)建藍(lán)圖classics_blueprint=Blueprint("classics_blueprint",__name__) #獲取所有文學(xué)類型@classics_blueprint.route('/get-classictypes')defget_classictypes():

#返回信息

result_msg={"code":"200","msg":"操作成功!"}

…………

導(dǎo)入了文學(xué)數(shù)據(jù)庫(kù)操作類ClassicsDao,并利用其提供的getClassictypes()函數(shù)來查詢數(shù)據(jù)庫(kù)中所有的文學(xué)類型。

3.4.開發(fā)文學(xué)導(dǎo)航API接口2.業(yè)務(wù)功能實(shí)現(xiàn)(3)注冊(cè)文學(xué)藍(lán)圖打開“cls_svr”項(xiàng)目的/app/app.py文件。在該文件中,我們進(jìn)行文學(xué)藍(lán)圖的注冊(cè)操作。以下是實(shí)現(xiàn)這一功能的關(guān)鍵代碼:......fromapp.api.classics_blueprintimportclassics_blueprint#注冊(cè)藍(lán)圖app.register_blueprint(classics_blueprint,url_prefix="/api/classics")

......在上述代碼中,我們導(dǎo)入了文學(xué)藍(lán)圖classics__blueprint,通過register_blueprint()注冊(cè)文學(xué)藍(lán)圖,藍(lán)圖的url_prefix="/api/classics",作為藍(lán)圖的URL規(guī)則。

3.4.開發(fā)文學(xué)導(dǎo)航API接口2.業(yè)務(wù)功能實(shí)現(xiàn)(4)“首頁”文學(xué)導(dǎo)航API接口測(cè)試項(xiàng)目啟動(dòng)后,可以通過“:5000//api/classics/get-classictypes”進(jìn)行訪問,測(cè)試結(jié)果如圖所示。

3.5.開發(fā)文學(xué)推薦API接口接下來,我們著手開發(fā)“首頁”文學(xué)推薦API接口。

3.5.開發(fā)文學(xué)推薦API接口1.需求描述

“首頁”文學(xué)推薦API接口主要用于初始化并呈現(xiàn)首頁的內(nèi)容。它會(huì)從數(shù)據(jù)庫(kù)中查詢出各類文學(xué)類型中星級(jí)評(píng)價(jià)最高的文學(xué)作品列表。隨后,它會(huì)將這些查詢出的文學(xué)信息列表返回給客戶端。在這一過程中,接口需要對(duì)數(shù)據(jù)庫(kù)中的文學(xué)類型表(classictype)和文學(xué)表(classics),進(jìn)行高效且精準(zhǔn)的數(shù)據(jù)查詢。該API接口的詳細(xì)說明,請(qǐng)參見課本表3.13。

3.5.開發(fā)文學(xué)推薦API接口2.業(yè)務(wù)功能實(shí)現(xiàn)接下來,我們將著手開發(fā)“首頁”文學(xué)推薦API接口。以下是具體的開發(fā)步驟。(1)開發(fā)數(shù)據(jù)操作模塊在“cls_svr”項(xiàng)目中,找到app/dao/ClassicsDao.py文件,在該文件中,開發(fā)文學(xué)查詢的功能,具體關(guān)鍵代碼如下所示:......fromapp.model.modelsimportClassics,ClassicsSchema#2.獲取文學(xué)列表(首頁推薦使用)defgetClassicsByIndex(self,tid,num):try:#排序查詢:所有文學(xué)按星級(jí)評(píng)價(jià)從高到低排序,取前num個(gè)classics=Classics.query.filter(Classics.tid==tid)......在上述代碼中,我們定義了一個(gè)名為getClassicsByIndex的函數(shù),該函數(shù)接收兩個(gè)參數(shù):tid和num,分別代表文學(xué)類型編號(hào)和推薦的文學(xué)數(shù)量。該函數(shù)會(huì)根據(jù)提供的tid參數(shù),在文學(xué)表(classics)中查詢相應(yīng)類型的數(shù)據(jù),查詢結(jié)果會(huì)按照星級(jí)進(jìn)行降序排列,以確保用戶最先看到的是評(píng)價(jià)最高的文學(xué)作品。之后,函數(shù)會(huì)選取排列后的前num條記錄,并以列表的形式返回。

3.5.開發(fā)文學(xué)推薦API接口2.業(yè)務(wù)功能實(shí)現(xiàn)(2)開發(fā)文學(xué)推薦邏輯在“cls_svr”項(xiàng)目中,找到位于app/api/classics_blueprint.py的文學(xué)藍(lán)圖文件,并開發(fā)文學(xué)推薦API接口。以下是關(guān)鍵代碼實(shí)現(xiàn):......fromapp.model.modelsimportClassics,ClassicsSchema#按文學(xué)類型,獲取推薦文學(xué)列表(首頁)@classics_blueprint.route('/recommend-classics/<int:num>')defrecommend_classics(num):#返回信息result_msg={"code":"200","msg":"操作成功!"}#判斷請(qǐng)求及參數(shù)是否正確............在上述代碼中,我們利用getClassictypes()函數(shù)查詢出所有的文學(xué)類型;接著,通過循環(huán)遍歷文學(xué)類型列表,獲取文學(xué)類型的編號(hào)tid,然后以tid為參數(shù)調(diào)用getClassicsByIndex()函數(shù)查詢對(duì)應(yīng)的文學(xué)列表,將其加入rd_list列表中。最后我們將rd_list列表以JSON格式返回給客戶端。

3.5.開發(fā)文學(xué)推薦API接口2.業(yè)務(wù)功能實(shí)現(xiàn)(3)“首頁”文學(xué)推薦API接口測(cè)試項(xiàng)目啟動(dòng)后,可以通過“:5000/api/classics/recommend-classics/6”進(jìn)行訪問,測(cè)試結(jié)果如圖所示。

3.6.開發(fā)文學(xué)搜索API接口接下來,我們著手開發(fā)“首頁”文學(xué)搜索API接口。

3.6.開發(fā)文學(xué)搜索API接口1.需求描述

“首頁”文學(xué)搜索API接口的主要功能是為用戶提供一個(gè)搜索功能。當(dāng)該接口被調(diào)用時(shí),它會(huì)根據(jù)用戶輸入的關(guān)鍵字,在數(shù)據(jù)庫(kù)中查詢與之匹配的文學(xué)作品。在此過程中,接口將訪問文學(xué)表(classics),并將查詢到的文學(xué)信息返回給客戶端。該API接口的詳細(xì)說明,請(qǐng)參見課本表3.14。

3.6.開發(fā)文學(xué)搜索API接口2.業(yè)務(wù)功能實(shí)現(xiàn)接下來,我們將著手開發(fā)“首頁”文學(xué)搜索API接口。以下是具體的開發(fā)步驟。

3.6.開發(fā)文學(xué)搜索API接口(1)開發(fā)數(shù)據(jù)操作模塊

在“cls_svr”項(xiàng)目中,找到app/dao/ClassicsDao.py文件,在該文件中,開發(fā)文學(xué)搜索的功能,具體關(guān)鍵代碼如下所示:2.業(yè)務(wù)功能實(shí)現(xiàn)......#3.搜索文學(xué)列表(按文學(xué)標(biāo)題搜索)defsearchClassicsByKeyword(self,keyword):try:#按文學(xué)標(biāo)題進(jìn)行模糊查詢

classics=Classics.query.filter(Classics.title.contains(keyword)).all()returnclassicsexceptExceptionase:print(e)pass......

3.6.開發(fā)文學(xué)搜索API接口

在上述代碼中,我們定義了一個(gè)名為searchClassicsByKeyword(self,keyword)的函數(shù),該函數(shù)會(huì)根據(jù)查詢關(guān)鍵字對(duì)文學(xué)作品的搜索。函數(shù)將接收一個(gè)keyword參數(shù),即查詢關(guān)鍵字,函數(shù)會(huì)在文學(xué)表(classics)中查找標(biāo)題包含該關(guān)鍵字的文學(xué)作品。2.業(yè)務(wù)功能實(shí)現(xiàn)

3.6.開發(fā)文學(xué)搜索API接口(2)開發(fā)文學(xué)搜索邏輯在“cls_svr”項(xiàng)目中,找到位于app/api/classics_blueprint.py的文學(xué)藍(lán)圖文件。在此文學(xué)藍(lán)圖中,我們將定義文學(xué)搜索API接口,用以查詢文學(xué)數(shù)據(jù)。以下是關(guān)鍵代碼實(shí)現(xiàn):2.業(yè)務(wù)功能實(shí)現(xiàn)......#按關(guān)鍵字,搜索文學(xué)列表(搜索)@classics_blueprint.route('/search-classics',methods=["POST"])defsearch_classics():result_msg={"code":"200","msg":"操作成功!"} #返回信息#獲取Json格式的請(qǐng)求,并解析JSONrequest_body=request.get_json()#判斷傳入的Json數(shù)據(jù)是否為空ifrequest.get_json()isNone:result_msg["code"]="404"result_msg["msg"]="參數(shù)錯(cuò)誤"returnjsonify(result_msg)

3.6.開發(fā)文學(xué)搜索API接口接上頁代碼2.業(yè)務(wù)功能實(shí)現(xiàn)#獲取參數(shù)keyword=request_body.get("keyword")#進(jìn)行搜索操作,創(chuàng)建數(shù)據(jù)庫(kù)操作對(duì)象db_op=ClassicsDao()#查詢文學(xué)列表classics=db_op.searchClassicsByKeyword(keyword)#many=True轉(zhuǎn)換多條數(shù)據(jù)classics_Schema=ClassicsSchema(many=True)classics_data=classics_Schema.dump(classics)#將轉(zhuǎn)換后的JSON格式數(shù)據(jù)存儲(chǔ)至返回結(jié)果result_msg["data"]=classics_data#返回操作結(jié)果returnjsonify(result_msg)......

3.6.開發(fā)文學(xué)搜索API接口

在上述代碼中,我們定義了search_classics()視圖函數(shù)。在該函數(shù)中,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論