




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
項目3:“古典文學網(wǎng)”首頁API接口開發(fā)
目錄01.06.拓展任務02.知識儲備04.技能拓展項目描述03.項目任務05.項目總結(jié)
學習目標知識目標:了解RESTfulAPI的核心概念,掌握API接口設計的原則與最佳實踐。了解Jinja2模板的語法及特性,掌握其開發(fā)動態(tài)網(wǎng)頁的技能;了解flask-sqlalchemy包的功能與特性,掌握其在項目開發(fā)中的應用。能力目標:通過學習RESTfulAPI的設計原則,能為“古典文學網(wǎng)”設計符合規(guī)范的API接口;通過學習Jinja2模板的相關(guān)知識,能夠運用Jinja2來構(gòu)建動態(tài)網(wǎng)頁;通過學習flask-sqlalchemy的相關(guān)知識,能夠為項目開發(fā)數(shù)據(jù)庫操作模塊。素質(zhì)目標:培養(yǎng)系統(tǒng)思維,嚴格遵守行業(yè)規(guī)范和標準,提高軟件質(zhì)量和可靠性;培養(yǎng)責任感、職業(yè)精神和團隊精神,遵守職業(yè)道德。01項目描述
1.項目描述
小白已經(jīng)逐步熟悉了項目的研發(fā)工作,接下來他計劃為項目開發(fā)數(shù)據(jù)庫操作模塊,以便更好地與MySQL數(shù)據(jù)庫進行交互。在此基礎上,他還將開發(fā)首頁模塊中的多個API接口,包括導航欄API接口、搜索API接口以及文學推薦API接口,并對注冊API接口和登錄API接口的進一步優(yōu)化,以確保用戶注冊和登錄流程的順暢與安全。02知識儲備
2.知識儲備
為了項目的順利開發(fā),小白需要了解了RESTfulAPI的設計原則,并熟悉了Jinja2模板引擎的使用方法,以及如何在Flask框架中執(zhí)行數(shù)據(jù)庫操作等關(guān)鍵知識。
2.1.后端API設計規(guī)范
下面,我們將探討API開發(fā)中應遵循的一些常見規(guī)范,以確保接口設計的高效性、易用性和可維護性。
2.1.后端API設計規(guī)范1.接口路徑規(guī)范(1)接口路徑開頭規(guī)范
一個產(chǎn)品,無論其后端由多少個服務構(gòu)成,都應當只擁有一個統(tǒng)一的API入口。其URL路徑的接口路徑,通常以“/api”或“/[版本號]/api”為起始,這有助于確保API的清晰性和一致性。以下便是正確的API設計規(guī)范::5000/api/task:5000/v2/api/tasks錯誤的API設計規(guī)范如下所示::5000/biz/tasks:5000/biz/api/tasks
2.1.后端API設計規(guī)范1.接口路徑規(guī)范(2)接口路徑命名規(guī)范
接口路徑應遵循統(tǒng)一的命名規(guī)范,即采用“api/aa-bb”的形式進行命名。以下是關(guān)于API設計的正確規(guī)范:
:5000/api/task-groups錯誤的API設計規(guī)范如下所示::5000/api/taskGroups在API設計中,接口路徑中的資源應遵循使用復數(shù)的原則,而非單數(shù)。以下是關(guān)于API設計的正確規(guī)范::5000/api/tasks錯誤的API設計規(guī)范如下所示::5000/api/task
2.1.后端API設計規(guī)范(3)接口需面向通用業(yè)務
在API設計過程中,我們應確保接口路徑的命名面向通用業(yè)務邏輯,而非局限于前端業(yè)務需求。以獲取篩選表單中任務字段下拉選項為例,以下是該API設計的正確規(guī)范:1.接口路徑規(guī)范:5000/api/tasks錯誤的API設計規(guī)范如下所示::5000/api/task-select-options
盡管目前這個接口僅被用于表單的下拉選擇中,我們?nèi)孕杩紤]其未來可能應用于各種場景的可能性。因此,我們應該以更加通用的方式提供接口,以便客戶端能夠自由組合和靈活使用。這樣的設計思路不僅滿足了當前的業(yè)務需求,還為未來的擴展和變化預留了足夠的空間。
2.1.后端API設計規(guī)范2.HTTP方法和HTTP狀態(tài)碼規(guī)范
在進行API設計時,我們需要規(guī)范地使用HTTP方法和HTTP狀態(tài)碼。HTTP方法(如GET、POST、PUT、DELETE等)應準確反映對資源的操作類型,而HTTP狀態(tài)碼則應清晰地傳達請求的處理結(jié)果。這樣的規(guī)范使用不僅能夠提高API的易用性和一致性,還能幫助客戶端更好地理解和處理響應。HTTP方法及HTTP狀態(tài)碼的具體內(nèi)容分別如表所示。HTTP的常見方法方法場景接口示例說明GET獲取數(shù)據(jù)獲取單個數(shù)據(jù):GET/api/tasks/1、獲取數(shù)據(jù)列表:GET/api/tasksPOST創(chuàng)建數(shù)據(jù)創(chuàng)建單個數(shù)據(jù):POST/api/tasksPATCH差量修改數(shù)據(jù)差量修改單個數(shù)據(jù):PATCH/api/tasks/1PUT全量修改數(shù)據(jù)全量修改單個數(shù)據(jù):PUT/api/tasks/1DELETE刪除數(shù)據(jù)刪除單個數(shù)據(jù):DELETE/api/tasks/1
2.1.后端API設計規(guī)范2.HTTP方法和HTTP狀態(tài)碼規(guī)范HTTP的常見狀態(tài)碼狀態(tài)碼場景200創(chuàng)建成功,通常用在同步操作時202創(chuàng)建成功,通常用在異步操作時,表示請求已接受,但是還沒有處理完成400參數(shù)錯誤,通常用在表單參數(shù)錯誤401授權(quán)錯誤,通常用在Token缺失或失效,注意401會觸發(fā)前端跳轉(zhuǎn)到登錄頁403操作被拒絕,通常發(fā)生在權(quán)限不足時,注意此時務必帶上詳細錯誤信息404沒有找到對象,通常發(fā)生在使用錯誤的id查詢詳情500服務器錯誤
2.1.后端API設計規(guī)范3.接口請求及響應數(shù)據(jù)規(guī)范(1)數(shù)據(jù)傳輸格式規(guī)范
在前后端的數(shù)據(jù)傳輸過程中,我們推薦使用標準的JSON格式。這不僅能提高數(shù)據(jù)的可讀性,還能減少反復的正反序列化操作,從而提升系統(tǒng)性能。以下是JSON格式數(shù)據(jù)的示例:{code:20000,status:200,message:"請求成功",data:{roles:[{id:1,name:'角色1'},{id:2,name:'角色2'}]}}需要注意的是,API設計規(guī)范中規(guī)定返回的是JSON格式數(shù)據(jù)而非JSON字符串。如果返回的是JSON字符串的話,需要額外進行字符串到JSON格式的轉(zhuǎn)換工作。
2.1.后端API設計規(guī)范(2)請求及響應字段命名
在API設計中,我們推薦采用“aa_bb_cc”的命名方式,以規(guī)范請求和響應字段的命名。這種命名方式有助于提高代碼的可讀性和一致性,使開發(fā)人員能夠更輕松地理解和維護API接口。以下是關(guān)于API設計的正確規(guī)范:3.接口請求及響應數(shù)據(jù)規(guī)范{role_ids:[11,12,35],}錯誤的API設計規(guī)范如下所示:{roleIds:[11,12,35],RoleIds:[11,12,35],ROLE_IDS:[11,12,35]}
2.1.后端API設計規(guī)范3.接口請求及響應數(shù)據(jù)規(guī)范(3)外層數(shù)據(jù)結(jié)構(gòu)在API設計中,當需要返回單個數(shù)據(jù)時,我們通常采用以對象形式返回數(shù)據(jù)的方式。以下是一個具體案例:當查詢某個任務時,API會返回該任務的相關(guān)信息,這些信息被封裝在一個對象中。以下是該API設計的正確規(guī)范:{code:200,status:200,message:"請求成功",data:{id:1,name:'任務1'}}
2.1.后端API設計規(guī)范3.接口請求及響應數(shù)據(jù)規(guī)范當需要返回多個數(shù)據(jù)時,我們通常會選擇以數(shù)組的形式來組織這些數(shù)據(jù)。以下是一個具體的應用場景:當查詢某組任務時,API會返回一個包含多個任務相關(guān)信息的JSON數(shù)組。以下是該API設計的正確規(guī)范:{code:200,status:200,message:"請求成功",data:{items:[{id:1,name:'任務1'},{id:2,name:'任務2'}],total:2}}注意:在API設計中,當需要返回空數(shù)據(jù)集時,我們應使用空數(shù)組[]來表示,而非null。
2.1.后端API設計規(guī)范4.敏感數(shù)據(jù)規(guī)范
在API設計中,對于涉及用戶隱私的敏感字段,我們應進行加密處理,以確保數(shù)據(jù)的安全性。以下是關(guān)于API設計的正確規(guī)范:{name:'小明',id_number:'U2FsdGVkX1+1fW7OpO/tlPXe4IGA/bXExlhKwIR/spk=',password:'U2FsdGVkX1/AnXKSBDbztNBfp4czlZxQ++3jRtNZhY0=',}錯誤的API設計規(guī)范如下所示:{name:'小明',id_number:,password:'ming@',}
2.1.后端API設計規(guī)范4.敏感數(shù)據(jù)規(guī)范
以上便是API開發(fā)中需遵循的一些常見規(guī)范。在未來的項目開發(fā)過程中,我們將以此為參照,進行API接口設計。然而,我們也不可一味生搬硬套,而是要根據(jù)項目的實際需求,靈活而審慎地運用這些設計規(guī)范,以確保項目開發(fā)的順利進行和最終成果的高質(zhì)量。
2.2.Flask的Jinja2模板引擎
在Web應用開發(fā)中,為了實現(xiàn)前后端的解耦并分離前后端邏輯,我們可以將頁面邏輯獨立出來,交由模板引擎進行渲染。鑒于“古典文學網(wǎng)”項目的前端開發(fā)采用Vue框架,對于Jinja2模板,我們在此僅簡要介紹其基本的使用方法。
2.2.Flask的Jinja2模板引擎1.Jinja2模板渲染
Flask默認采用Jinja2作為其模板引擎,我們通常調(diào)用render_template()函數(shù)來準確地定位到指定的模板文件,并生成一個Response對象。這個對象包含了經(jīng)過Jinja2渲染的HTML內(nèi)容,可直接供前端進行展示。而模板文件是一個HTML文件,并存放在Flask應用的templates文件夾中,以便于管理和調(diào)用。
下面我們來看一個簡單的模板渲染的案例,該案例顯示一段“HelloWorld!”文字,請參考以下步驟完成。
首先,在磁盤中創(chuàng)建一個名為hi_jinja2的文件夾,并使用VSCode打開它。接下來,請按照以下的目錄結(jié)構(gòu)來構(gòu)建項目目錄架構(gòu)。D:/Projects/hi_jinja2├──templates/│└──index.html├──static/└──app.py
2.2.Flask的Jinja2模板引擎1.Jinja2模板渲染隨后,請打開/templates/index.html模板文件。此文件向客戶展示“Hello
World!”的歡迎語,具體的代碼實現(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ù)來渲染模板。這個函數(shù)會查找templates文件夾中的模板文件,并返回一個包含渲染后的HTML的響應對象。這一過程的代碼實現(xiàn)如下:fromflaskimportFlaskfromflaskimportrender_templateapp=Flask(__name__)@app.route('/')defindex():
returnrender_template("index.html")if__name__=='__main__':app.run()
2.2.Flask的Jinja2模板引擎1.Jinja2模板渲染項目啟動后,在瀏覽器中輸入“:5000”進行訪問,運行效果如圖所示。
2.2.Flask的Jinja2模板引擎2.Jinja2模板的參數(shù)傳遞
在使用Jinja2模板引擎時,我們經(jīng)常需要向模板傳遞參數(shù)。這些參數(shù)可以是變量、列表、字典或任何其他Python數(shù)據(jù)類型。傳遞參數(shù)的主要目的是在模板中動態(tài)地展示數(shù)據(jù),或者根據(jù)傳遞的參數(shù)來控制模板的行為。
下面這個案例展示了如何傳遞更復雜的數(shù)據(jù)結(jié)構(gòu)(如:列表或字典)到模板中,并顯示傳遞的參數(shù)(請在前一小節(jié)的hi_jinja2項目中完成),具體操作參考如下步驟。
2.2.Flask的Jinja2模板引擎2.Jinja2模板的參數(shù)傳遞首先,在/app.py源文件中,找到index()視圖函數(shù)。在這個函數(shù)中,傳遞users列表給模板文件。以下是具體的代碼實現(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列表。以下是具體的代碼實現(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ù)傳遞項目啟動后,在瀏覽器中輸入“:5000”進行訪問,運行效果如圖所示。
2.2.Flask的Jinja2模板引擎3.Jinja2模板語法下面是一些Jinja2模板語法的基本元素和常見用法,詳細的模板語法請參考Jinja2官方文檔。(1)變量在上面的模板中,我們可能注意到了一些不同于HTML原生語法的特殊結(jié)構(gòu):{{var}}。這正是Jinja2模板引擎的語法特性,我們使用雙大括號{{}}來包裹變量,以便在渲染時輸出其值。以下是一個示例代碼片段,它用于在模板中輸出name變量的值。<p>Hello,{{name}}!</p>
2.2.Flask的Jinja2模板引擎3.Jinja2模板語法(2)條件語句
如果我們經(jīng)常需要根據(jù)某些條件來執(zhí)行不同的代碼塊,那么可以使用if、elif和else語句來進行條件判斷。這些語句允許我們根據(jù)條件的真假來選擇執(zhí)行相應的代碼塊,從而實現(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)來遍歷列表或字典,從而實現(xiàn)對集合中每個元素的迭代處理。這種循環(huán)結(jié)構(gòu)在模板渲染過程中非常有用,可以方便地展示集合中的數(shù)據(jù),并根據(jù)需要進行格式化或操作。以下示例展示了在模板中循環(huán)輸出items集合中的數(shù)據(jù)。{%foriteminitems%}<li>{{item}}</li>{%endfor%}</ul>
2.3.Flask的數(shù)據(jù)庫操作
接下來,我們將詳細介紹“古典文學網(wǎng)”項目的數(shù)據(jù)庫結(jié)構(gòu),并演示如何對用戶表進行常見的數(shù)據(jù)庫操作,包括增加、刪除、修改和查詢等操作。
2.3.Flask的數(shù)據(jù)庫操作1.創(chuàng)建項目數(shù)據(jù)庫(1)“古典文學網(wǎng)”數(shù)據(jù)庫首先,我們來介紹一下“古典文學網(wǎng)”項目的數(shù)據(jù)庫結(jié)構(gòu),該數(shù)據(jù)庫將在后續(xù)的開發(fā)中持續(xù)被使用。項目的數(shù)據(jù)庫名為classicsdb,其中包含6個表,具體的數(shù)據(jù)庫表說明參見課本表3.3~3.9。古典文學網(wǎng)”項目數(shù)據(jù)庫信息表數(shù)據(jù)庫名:classicsdb說明:編碼方式為UTF-8序號數(shù)據(jù)庫表備注1users用戶表2classictype文學類型表3classics文學表4discuss文學評論表5classicjudges文學評價表6discusjudges評論評價表說明:具體表結(jié)構(gòu)參考課本
2.3.Flask的數(shù)據(jù)庫操作1.創(chuàng)建項目數(shù)據(jù)庫(2)創(chuàng)建“古典文學網(wǎng)”數(shù)據(jù)庫
在了解“古典文學網(wǎng)”項目的數(shù)據(jù)庫結(jié)構(gòu)之后,我們選用MySQLWorkbench數(shù)據(jù)庫管理工具,來創(chuàng)建classicsdb數(shù)據(jù)庫。關(guān)于MySQLWorkbench工具的具體使用方法,可參考本項目的“3.4.1.使用MySQLWorkbench管理數(shù)據(jù)庫”部分。
我們需要使用MySQLWorkbench成功連接至MySQL數(shù)據(jù)庫服務,隨后打開了本項目素材中提供的classicsdb.sql數(shù)據(jù)庫腳本。通過執(zhí)行該腳本,我們順利創(chuàng)建了名為classicsdb的數(shù)據(jù)庫。創(chuàng)建完成的數(shù)據(jù)庫見圖所示。
2.3.Flask的數(shù)據(jù)庫操作2.連接數(shù)據(jù)庫
為了開發(fā)“古典文學”項目的數(shù)據(jù)庫操作模塊,請確保我們已經(jīng)正確安裝了Flask-SQLAlchemy和PyMySQL擴展庫。我們還需要配置數(shù)據(jù)庫連接的URI,該URI包含了連接數(shù)據(jù)庫所需的所有關(guān)鍵信息,諸如用戶名、密碼、主機名、數(shù)據(jù)庫名,以及一系列用于額外配置的可選關(guān)鍵字參數(shù)等。連接MySQL數(shù)據(jù)庫的URI的具體格式如下所示:mysql+pymysql://username:password@host:port/database?charset=utf8上述URI格式中的各個組成部分具有特定的含義,具體如下:lusername:MySQL數(shù)據(jù)庫用戶名;lpassword:與用戶名對應的密碼;lhost:MySQL服務器的主機名或IP地址;lport:MySQL服務器監(jiān)聽的端口號;ldatabase:連接的數(shù)據(jù)庫的名稱;lcharset=utf8:這是一個連接參數(shù),用于指定字符集為utf8。
2.3.Flask的數(shù)據(jù)庫操作2.連接數(shù)據(jù)庫接下來,我們將開發(fā)一個案例,旨在連接“古典文學網(wǎng)”的classicsdb數(shù)據(jù)庫。以下是具體的代碼實現(xiàn):fromflaskimportFlaskfromflask_sqlalchemyimportSQLAlchemyapp=Flask(__name__)#載入數(shù)據(jù)庫配置#MySql連接的URIapp.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#記錄所有發(fā)送到標準輸出的SQL語句,通常在開發(fā)調(diào)試時很有幫助。app.config['SQLALCHEMY_ECHO']=True
#創(chuàng)建數(shù)據(jù)庫的操作對象db=SQLAlchemy(app)if__name__=="__main__":app.run()在上述代碼中,我們首先對SQLALCHEMY_DATABASE_URI和SQLALCHEMY_ECHO進行了配置,以便指定數(shù)據(jù)庫的連接信息和是否開啟SQLAlchemy的日志輸出。隨后,通過調(diào)用SQLAlchemy(app)語句,我們成功創(chuàng)建了數(shù)據(jù)庫操作對象db。
2.3.Flask的數(shù)據(jù)庫操作3.構(gòu)建模型類
在使用Flask-SQLAlchemy進行數(shù)據(jù)庫操作時,我們必須定義與數(shù)據(jù)庫相對應的模型類。這些模型類均繼承自db.Model,用于描述數(shù)據(jù)庫表的結(jié)構(gòu)和字段。通常情況下,這些模型類會被保存在models.py文件中,以便于管理和維護。通過定義這些模型類,我們可以方便地實現(xiàn)與數(shù)據(jù)庫的交互,包括數(shù)據(jù)的增刪改查等操作。
2.3.Flask的數(shù)據(jù)庫操作3.構(gòu)建模型類接下來,我們將定義與“古典文學網(wǎng)”數(shù)據(jù)庫中users表相對應的模型類。以下是具體的代碼實現(xiàn):classUsers(db.Model):
__tablename__='users'__table_args__={'comment':'用戶表'}uid:Mapped[int]=mapped_column(Integer,primary_key=True,comment='用戶編號')uname:Mapped[str]=mapped_column(VARCHAR(100),comment='登錄賬號')upwd:Mapped[str]=mapped_column(VARCHAR(100),comment='登錄密碼')nikename: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ù)庫操作3.構(gòu)建模型類在上述代碼中,我們定義了一個名為Users的類,它借助__tablename__屬性與數(shù)據(jù)庫中的users表建立了關(guān)聯(lián)。同時,我們定義了uid、uname等屬性,它們與users表中的相應字段一一對應。通過Users類,我們可以輕松地對users數(shù)據(jù)庫表執(zhí)行增刪改查等操作。在項目開發(fā)中,我們會使用flask-marshmallow和marshmallow-sqlalchemy擴展,它們主要用于將復雜的數(shù)據(jù)類型(如SQLAlchemy模型)轉(zhuǎn)換為JSON格式,以及從JSON轉(zhuǎn)換回Python對象。在開始構(gòu)建模型類之前,請確保我們已經(jīng)正確安裝了flask-marshmallow和marshmallow-sqlalchemy擴展庫。在使用flask-marshmallow擴展庫時,我們首先需要執(zhí)行以下代碼來進行初始化操作。#初始化Marshmallowma=Marshmallow(app)
2.3.Flask的數(shù)據(jù)庫操作3.構(gòu)建模型類接下來,我們將定義與Users模型類相對應的Schema類。這個Schema類的主要作用是將Users模型類的數(shù)據(jù)轉(zhuǎn)換為JSON格式,以便在前后端交互中更便捷地處理數(shù)據(jù)。以下是Users轉(zhuǎn)化類具體的代碼實現(xiàn),它展示了如何構(gòu)建這樣一個轉(zhuǎn)換類。#使用flask-marshmallow自動生成schema
classUsersSchema(ma.Schema):
classMeta:
model=Users
#序列化的字段
fields=("uid","uname","upwd","nikename","avatar","sex","phone","remark")在上述代碼中,我們定義了一個名為UsersSchema的轉(zhuǎn)換類。通過model字段,我們將其與Users模型類進行了關(guān)聯(lián),從而確保它能夠準確地轉(zhuǎn)換Users模型類的數(shù)據(jù)。同時,利用fields字段,我們明確指定了需要序列化的Users模型類的屬性,以便在轉(zhuǎn)換過程中只包含所需的信息。
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作
接下來,我們將以Users模型類為例,詳細介紹如何使用Flask-SQLAlchemy擴展庫的API進行數(shù)據(jù)庫操作。(1)增加數(shù)據(jù)
在Flask-SQLAlchemy擴展庫中,增加數(shù)據(jù)主要是通過創(chuàng)建模型類的實例,并將其添加到數(shù)據(jù)庫會話中,最后提交會話來完成的。會話(session)提供了增加數(shù)據(jù)的add()和add_all()方法,其中add()方法用于向數(shù)據(jù)庫中增加一條記錄,add_all()方法用于向數(shù)據(jù)庫中增加多條記錄。
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作
接下來,我們將以上一節(jié)中定義的Users模型類為例,開發(fā)一個增加用戶的API接口,演示如何向數(shù)據(jù)庫中增加用戶數(shù)據(jù)。以下是部分的實現(xiàn)代碼(具體代碼參考課本):fromflaskimportFlask,jsonify…………app=Flask(__name__)#載入數(shù)據(jù)庫配置#MySql連接的URIapp.config['SQLALCHEMY_DATABASE_URI']='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#
記錄所有發(fā)送到標準輸出的SQL語句,通常在開發(fā)調(diào)試時很有幫助。app.config['SQLALCHEMY_ECHO']=True
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作
接上頁代碼#創(chuàng)建數(shù)據(jù)庫的操作對象db=SQLAlchemy(app)#初始化Marshmallowma=Marshmallow(app)#1.增加用戶數(shù)據(jù)@app.route('/add')defadd_user():
#新建用戶對象user1=Users(uname='xiaoming',upwd='123456',nikename='小明',avatar='xm.jpg',……
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作在上述代碼中,我們在add_user()視圖函數(shù)中,通過add()和add_all()方法,成功地向數(shù)據(jù)庫中添加了三條用戶數(shù)據(jù)。項目啟動后,可以通過“:5000/add”進行訪問,在數(shù)據(jù)庫的users數(shù)據(jù)表可以看到增加的用戶數(shù)據(jù),如圖所示。
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作
(2)查詢數(shù)據(jù)Flask-SQLAlchemy擴展庫提供了query屬性,這個屬性是一個功能強大的查詢構(gòu)造器。當我們訪問這個屬性時,會得到一個新的查詢對象,該對象提供了豐富的過濾器和查詢方法,使我們能夠?qū)Σ樵兘Y(jié)果進行精確的過濾和篩選。查詢數(shù)據(jù)的語法格式如下所示:模型類.query.<過濾器>.<查詢方法>
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作
(2)查詢數(shù)據(jù)在上述格式中,過濾器和查詢方法是可選的,使用過濾器會返回一個新的查詢對象,過濾和查詢方法可以疊加使用,也可單獨使用。查詢對象的過濾器和查詢方法分別見表
常用的SQLAlchemy查詢過濾器過濾器說明filter把過濾器添加到原查詢上,返回一個新查詢filter_by把等值過濾器添加到原查詢上,返回一個新查詢limit使用指定的值限定原查詢返回的結(jié)果offset偏移原查詢返回的結(jié)果,返回一個新查詢order_by根據(jù)指定條件對原查詢結(jié)果進行排序,返回一個新查詢group_by根據(jù)指定條件對原查詢結(jié)果進行分組,返回一個新查詢
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作
(2)查詢數(shù)據(jù)在上述格式中,過濾器和查詢方法是可選的,使用過濾器會返回一個新的查詢對象,過濾和查詢方法可以疊加使用,也可單獨使用。查詢對象的過濾器和查詢方法分別見表
常用的SQLAlchemy查詢方法方法說明all()以列表形式返回查詢的所有結(jié)果first()返回查詢的第一個結(jié)果,如果未查到,返回Nonefirst_or_404()返回查詢的第一個結(jié)果,如果未查到,返回404get()返回指定主鍵對應的行,如不存在,返回Noneget_or_404()返回指定主鍵對應的行,如不存在,返回404count()返回查詢結(jié)果的數(shù)量paginate()返回一個Paginate對象,它包含指定范圍內(nèi)的結(jié)果
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作接下來,我們將展示一些針對users表的常用查詢案例,演示如何進行數(shù)據(jù)的查詢操作。常見的查詢操作的部分代碼如下所示(具體代碼參考課本):#簡單查詢users=Users.query.all()#查詢所有用戶數(shù)據(jù)count=Users.query.count()#查詢有多少個用戶user=Users.query.first()#查詢第1個用戶
#根據(jù)uid查詢
返回模型對象/Noneuser=Users.query.get(5)users=Users.query.filter_by(uid=5).all()user=Users.query.filter(Users.uid==5).first()
#查詢昵稱以某個字符開始/結(jié)尾/包含的所有用戶users=Users.query.filter(Users.nikename.endswith("g")).all()users=Users.query.filter(Users.nikename.startswith("w")).all()
…………
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作接下來,我們將展示一些針對users表的常用查詢案例,演示如何進行數(shù)據(jù)的查詢操作。常見的查詢操作的部分代碼如下所示(具體代碼參考課本):#簡單查詢users=Users.query.all()#查詢所有用戶數(shù)據(jù)count=Users.query.count()#查詢有多少個用戶user=Users.query.first()#查詢第1個用戶
#根據(jù)uid查詢
返回模型對象/Noneuser=Users.query.get(5)users=Users.query.filter_by(uid=5).all()user=Users.query.filter(Users.uid==5).first()
#查詢昵稱以某個字符開始/結(jié)尾/包含的所有用戶users=Users.query.filter(Users.nikename.endswith("g")).all()users=Users.query.filter(Users.nikename.startswith("w")).all()
…………
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作項目啟動后,可以通過“:5000/seach”進行訪問,測試結(jié)果如圖3.5所示。
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作(3)更新數(shù)據(jù)更新數(shù)據(jù)的過程相對直觀且簡便。我們只需為模型類的相關(guān)字段重新賦值,即可實現(xiàn)對原有字段值的修改。完成修改后,為確保更改生效,需要調(diào)用commit()方法,將數(shù)據(jù)變更提交至數(shù)據(jù)庫中進行保存。接下來,我們開發(fā)一個修改用戶的API接口(基于上一小節(jié)的案例中完成),修改用戶編號(uid字段)為2的用戶的昵稱(nikename字段),具體代碼如下所示:#3.更新用戶數(shù)據(jù)@app.route('/update')defupdate_user():#返回主鍵為2的對應用戶user=Users.query.get(2)#修改用戶昵稱user.nikename='李白'
#提交會話以保存更改
mit()
returnjsonify({"code":200,"msg":"操作成功"})
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作在上述代碼中,我們首先查詢了編號為2的用戶,然后將其昵稱修改為“李白”,并通過提交到數(shù)據(jù)庫的方式完成了用戶數(shù)據(jù)的更新操作。項目啟動后,可以通過“:5000/update”進行訪問,在數(shù)據(jù)庫的users數(shù)據(jù)表可以看到修改后的用戶數(shù)據(jù),如圖所示。
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作(4)刪除數(shù)據(jù)當我們需要從數(shù)據(jù)庫表中刪除一個或多個不再需要的記錄時,只需簡單地調(diào)用delete()方法,即可輕松實現(xiàn)數(shù)據(jù)的刪除操作。接下來,我們開發(fā)一個刪除用戶信息的API接口(基于上一小節(jié)的案例中完成),刪除用戶編號(uid字段)為9的用戶,具體代碼如下所示:#4.刪除用戶數(shù)據(jù)@app.route('/delete')defdelete_user():#返回主鍵為9的對應用戶user=Users.query.get(9)#刪除用戶數(shù)據(jù)db.session.delete(user)#提交會話以保存更改mit()returnjsonify({"code":200,"msg":"操作成功"})
2.3.Flask的數(shù)據(jù)庫操作4.數(shù)據(jù)庫操作在上述代碼中,我們首先查詢了編號為9的用戶,然后使用delete()方法將其刪除,最后提交到數(shù)據(jù)庫,完成了用戶數(shù)據(jù)的刪除操作。項目啟動后,可以通過“:5000/delete”進行訪問,在數(shù)據(jù)庫的users數(shù)據(jù)表可以看到編號為9的用戶被刪除了,如圖所示。03項目任務
3.項目任務
在這一階段,小白將開發(fā)“古典文學網(wǎng)”項目的數(shù)據(jù)操作模塊,并完成首頁模塊文學導航API接口、文學推薦API接口、文學搜索API接口、輪播圖API接口的開發(fā)工作及進一步完善用戶注冊與登錄的API接口功能。
3.1.開發(fā)項目的數(shù)據(jù)操作模塊1.需求描述
在本次任務中,我們將為“古典文學網(wǎng)”的后端項目開發(fā)數(shù)據(jù)庫操作模塊。首先,我們需要在“古典文學網(wǎng)”后端項目中進行數(shù)據(jù)庫配置工作,確保數(shù)據(jù)庫的穩(wěn)定運行與高效性能。隨后,我們將開發(fā)后端項目的數(shù)據(jù)操作模塊,使項目能夠正常、順暢地訪問數(shù)據(jù)庫。
3.1.開發(fā)項目的數(shù)據(jù)操作模塊2.業(yè)務功能實現(xiàn)(1)配置數(shù)據(jù)庫連接
在后端“cls_svr”項目的app/conf/目錄下,我們需要創(chuàng)建一個名為dbconfig.py的數(shù)據(jù)庫配置文件。在該文件中,我們將配置數(shù)據(jù)庫的連接信息。請確保項目數(shù)據(jù)庫classicsdb已經(jīng)正確創(chuàng)建(參照3.2.3.小節(jié)中創(chuàng)建數(shù)據(jù)庫的操作)。以下是dbconfig.py配置文件的代碼實現(xiàn):#------MySQL數(shù)據(jù)庫配置------#MySql連接的URISQLALCHEMY_DATABASE_URI='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#記錄所有發(fā)送到標準輸出的SQL語句,通常在開發(fā)調(diào)試時很有幫助。SQLALCHEMY_ECHO=True
上述代碼中,我們配置了項目的數(shù)據(jù)庫訪問信息,其中classicsdb為古典文學網(wǎng)的數(shù)據(jù)庫名稱。
3.1.開發(fā)項目的數(shù)據(jù)操作模塊2.業(yè)務功能實現(xiàn)(1)配置數(shù)據(jù)庫連接
在后端“cls_svr”項目的app/conf/目錄下,我們需要創(chuàng)建一個名為dbconfig.py的數(shù)據(jù)庫配置文件。在該文件中,我們將配置數(shù)據(jù)庫的連接信息。請確保項目數(shù)據(jù)庫classicsdb已經(jīng)正確創(chuàng)建(參照3.2.3.小節(jié)中創(chuàng)建數(shù)據(jù)庫的操作)。以下是dbconfig.py配置文件的代碼實現(xiàn):#------MySQL數(shù)據(jù)庫配置------#MySql連接的URISQLALCHEMY_DATABASE_URI='mysql+pymysql://root:123456@:3306/classicsdb?charset=utf8'#記錄所有發(fā)送到標準輸出的SQL語句,通常在開發(fā)調(diào)試時很有幫助。SQLALCHEMY_ECHO=True
上述代碼中,我們配置了項目的數(shù)據(jù)庫訪問信息,其中classicsdb為古典文學網(wǎng)的數(shù)據(jù)庫名稱。
3.1.開發(fā)項目的數(shù)據(jù)操作模塊(2)開發(fā)項目數(shù)據(jù)操作框架
接下來,我們需要在項目中加載數(shù)據(jù)庫配置信息,并構(gòu)建完整的數(shù)據(jù)庫操作框架。首先,我們需要定位到項目中的app/__init__.py文件。在此文件中,我們將加載數(shù)據(jù)庫配置并創(chuàng)建數(shù)據(jù)庫操作對象,以便后續(xù)能夠順利執(zhí)行數(shù)據(jù)庫操作。以下是關(guān)鍵代碼的具體實現(xiàn):......fromapp.conf.dbconfigimportSQLALCHEMY_DATABASE_URIfromapp.conf.dbconfigimportSQLALCHEMY_ECHOfromflask_sqlalchemyimportSQLAlchemyfromflask_marshmallowimportMarshmallow......db=SQLAlchemy()#創(chuàng)建數(shù)據(jù)庫的操作對象ma=Marshmallow()#初始化Marshmallow
2.業(yè)務功能實現(xiàn)
3.1.開發(fā)項目的數(shù)據(jù)操作模塊接上頁代碼defcreate_app():
......
#載入數(shù)據(jù)庫配置
app.config['SQLALCHEMY_DATABASE_URI']=SQLALCHEMY_DATABASE_URIapp.config['SQLALCHEMY_ECHO']=SQLALCHEMY_ECHO
#數(shù)據(jù)庫操作對象綁定app
db.init_app(app)
ma.init_app(app)
......
returnapp
2.業(yè)務功能實現(xiàn)在上述代碼中,我們導入dbconfig.py中的數(shù)據(jù)庫配置信息,并將配置參數(shù)加載到Flask實例中。隨后,我們創(chuàng)建了數(shù)據(jù)庫操作對象db和模型類轉(zhuǎn)換對象ma,并調(diào)用init_app(app)方法完成了初始化操作。
3.1.開發(fā)項目的數(shù)據(jù)操作模塊(3)構(gòu)建項目模型類
我們接下來需要為“古典文學網(wǎng)”項目創(chuàng)建數(shù)據(jù)庫模型類。我們需要找到本項目素材中的數(shù)據(jù)庫模型文件models.py,將models.py復制到“cls_svr”項目的app/model/目錄下,以便項目能夠正確識別并使用這些模型類。以下是models.py代碼片段。2.業(yè)務功能實現(xiàn)fromtypingimportList,Optional…………#導入數(shù)據(jù)庫操作對象fromappimportdbfromappimportmaclassClassictype(db.Model):__tablename__='classictype'
__table_args__={'comment':'古典文學類型表'}tid:Mapped[int]=mapped_column(Integer,primary_key=True)…………對應上述模型類,建議直接使用本項目素材提供的數(shù)據(jù)庫模型類文件models.py
3.2.完善用戶注冊API接口
在前面的開發(fā)中,我們已經(jīng)成功開發(fā)了用戶的注冊API接口。然而,該接口目前尚未包含數(shù)據(jù)庫操作模塊。接下來,我們將為該接口加入數(shù)據(jù)庫操作功能。
3.2.完善用戶注冊API接口1.需求描述
請在后端“cls_svr”項目的基礎上,擴展用戶注冊API接口的功能,為其加入了數(shù)據(jù)庫操作模塊,該模塊的主要作用是將用戶的注冊數(shù)據(jù)插入到用戶表(users)中。通過這一改進,我們成功完成了整個用戶注冊API接口功能的開發(fā),為用戶提供了更加便捷、高效的注冊體驗。
3.2.完善用戶注冊API接口2.業(yè)務功能實現(xiàn)接下來,我們將著手完善用戶注冊API接口。以下是具體的開發(fā)步驟。(1)開發(fā)數(shù)據(jù)操作模塊在“cls_svr”項目的app/dao/目錄下創(chuàng)建用戶數(shù)據(jù)庫操作模塊文件UsersDao.py,并開發(fā)增加用戶的功能,具體代碼如下所示:fromappimportdbfromapp.model.modelsimportUsers#數(shù)據(jù)庫操作類classUsersDao:def__init__(self):print("UsersDaoisruning")
3.2.完善用戶注冊API接口2.業(yè)務功能實現(xiàn)接上頁代碼:#1.增加一個用戶defaddUser(self,user):flag=True#成功標志,True操作成功,F(xiàn)alse操作失敗try:db.session.add(user)mit()#提交至數(shù)據(jù)庫exceptExceptionase:flag=Falsedb.session.rollback()#異常,回滾數(shù)據(jù)庫passreturnflag在上述代碼中,我們創(chuàng)建了一個名為UsersDao的數(shù)據(jù)庫操作類。在UsersDao類中,我們定義了一個addUser(self,user)函數(shù),該函數(shù)接收一個user參數(shù),即用戶對象,用于將新用戶信息添加到數(shù)據(jù)庫表(users)中。該方法執(zhí)行后會返回一個名為flag的變量,當flag的值為True時,表示用戶添加操作已成功完成;若flag的值為False,則意味著添加操作未能成功執(zhí)行。
3.2.完善用戶注冊API接口2.業(yè)務功能實現(xiàn)(2)完善用戶注冊邏輯
在“cls_svr”項目的app/api/user_blueprint.py文件中,我們需要找到用戶注冊的視圖函數(shù)register()。在該函數(shù)內(nèi)部,我們需要增加數(shù)據(jù)庫操作邏輯代碼,以便在用戶注冊時能夠?qū)⑾嚓P(guān)信息正確存儲到數(shù)據(jù)庫中。以下是關(guān)鍵代碼實現(xiàn):......#引入數(shù)據(jù)庫操作對象fromapp.dao.UsersDaoimportUsersDaofromapp.model.modelsimportUsers#用戶注冊接口@user_blueprint.route('/register',methods=["POST"])defregister():
......#注冊用戶,創(chuàng)建數(shù)據(jù)庫操作對象
db_op=UsersDao()
3.2.完善用戶注冊API接口2.業(yè)務功能實現(xiàn)接上頁代碼:#新建用戶對象
user=Users(uname=uname,upwd=upwd,nikename=nikename,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)......在上述代碼中,我們成功導入了用戶的數(shù)據(jù)庫操作類UsersDao,并借助其提供的addUser()函數(shù),將用戶信息添加至用戶表(users)中,從而實現(xiàn)了用戶的注冊功能。
3.2.完善用戶注冊API接口2.業(yè)務功能實現(xiàn)(3)用戶注冊API接口測試項目啟動后,可以通過“:5000/api/user/register”進行訪問,測試結(jié)果如圖所示。
3.3.完善用戶登錄API接口
在前面的開發(fā)中,我們已經(jīng)成功開發(fā)了用戶的登錄API接口。然而,該接口目前尚未包含數(shù)據(jù)庫操作模塊。接下來,我們將為該接口加入數(shù)據(jù)庫操作功能。
3.3.完善用戶登錄API接口1.需求描述
請在后端“cls_svr”項目的基礎上,擴展用戶登錄API接口的功能,為其加入了數(shù)據(jù)庫操作模塊。該模塊的主要作用是查詢登錄用戶是否在用戶表(users)中。通過這一改進,我們成功完成了用戶登錄API接口功能的開發(fā),為用戶提供了更加便捷、高效的登錄體驗。
3.3.完善用戶登錄API接口2.業(yè)務功能實現(xiàn)接下來,我們將著手完善用戶登錄API接口。以下是具體的開發(fā)步驟。(1)開發(fā)數(shù)據(jù)操作模塊
在“cls_svr”項目中,找到“app/dao/UsersDao.py”文件,在該文件中,開發(fā)用戶登錄查詢的功能,具體關(guān)鍵代碼如下所示:
3.3.完善用戶登錄API接口2.業(yè)務功能實現(xiàn)......#2.通過賬號及密碼查詢用戶defgetUserByLogin(self,uname,upwd):try:#查詢user=Users.query.filter(Users.uname==uname,Users.upwd==upwd).first()returnuserexceptExceptionase:print(e)pass......在上述代碼中,我們定義了一個名為getUserByLogin(self,uname,upwd)的函數(shù),它接受兩個參數(shù):uname和upwd,分別代表用戶的賬號和密碼。隨后,該函數(shù)會利用這些賬號和密碼信息在用戶數(shù)據(jù)庫表(users)中進行查詢,以驗證用戶是否存在。
3.3.完善用戶登錄API接口2.業(yè)務功能實現(xiàn)(2)開發(fā)用戶登錄邏輯
在“cls_svr”項目的app/api/user_blueprint.py文件中,我們找到用戶登錄的視圖函數(shù)login()。在該函數(shù)內(nèi)部,我們需要增加數(shù)據(jù)庫操作邏輯代碼,以便驗證用戶是否存在。以下是關(guān)鍵代碼實現(xiàn):......#用戶登錄接口@user_blueprint.route('/login',methods=["POST"])deflogin():
#返回信息
result_msg={"code":"200","msg":"操作成功!"}......#進行登錄,創(chuàng)建數(shù)據(jù)庫操作對象
db_op=UsersTypeDao()
#進行登錄操作
user=db_op.getUserByLogin(uname,upwd)#判斷是否登錄成功
ifuserisnotNone:
......在上述代碼中,我們在登錄視圖函數(shù)login()中調(diào)用getUserByLogin()函數(shù),該函數(shù)根據(jù)賬號和密碼信息進行驗證,并把驗證結(jié)果返回給客戶端,從而完成了整個登錄流程。
3.3.完善用戶登錄API接口2.業(yè)務功能實現(xiàn)(3)用戶登錄API接口測試項目啟動后,可以通過“:5000/api/user/login”進行訪問,測試結(jié)果如圖所示。
3.4.開發(fā)文學導航API接口接下來,我們著手開發(fā)“首頁”文學導航API接口。
3.4.開發(fā)文學導航API接口1.需求描述“首頁”文學導航API接口的主要功能是初始化首頁的導航欄。在接口被調(diào)用時,它會從數(shù)據(jù)庫中查詢出所有的文學類型,并將這些信息以導航欄的形式在首頁上呈現(xiàn)給用戶。這一過程中,接口需要訪問數(shù)據(jù)庫中的文學類型表(classictype),并將查詢到的文學類型信息返回給客戶端,以便客戶端能夠正確地展示這些導航項。該API接口的詳細說明,請參見課本表3.12。
3.4.開發(fā)文學導航API接口2.業(yè)務功能實現(xiàn)
接下來,我們將著手開發(fā)“首頁”文學導航API接口。以下是具體的開發(fā)步驟。
3.4.開發(fā)文學導航API接口2.業(yè)務功能實現(xiàn)(1)開發(fā)數(shù)據(jù)操作模塊在“cls_svr”項目的app/dao/目錄下創(chuàng)建文學數(shù)據(jù)庫操作模塊ClassicsDao.py,并開發(fā)查詢文學類型的功能,具體代碼如下所示:fromappimportdbfromapp.model.modelsimportClassictype,Classics#數(shù)據(jù)庫操作類classClassicsDao:def__init__(self):print("ClassicsDaoisruning")#1.獲取文學類型列表defgetClassictypes(self):try:#獲取所有文學類型
classictypes=Classictype.query.all()returnclassictypesexceptExceptionase:print(e)pass在上述代碼中,創(chuàng)建了一個名為ClassicsDao的數(shù)據(jù)庫操作類,該類負責處理與數(shù)據(jù)庫相關(guān)的文學操作。在ClassicsDao類中,我們定義了一個getClassictypes()函數(shù),該函數(shù)用于查詢文學類型表(classictype)的數(shù)據(jù),并以列表的形式返回。
3.4.開發(fā)文學導航API接口2.業(yè)務功能實現(xiàn)(2)創(chuàng)建文學藍圖在“cls_svr”項目的app/api/目錄下創(chuàng)建文學藍圖classics_blueprint.py,用以獲取文學類型數(shù)據(jù),具體代碼如下所示:fromflaskimportBlueprint,requestfromflaskimportjsonify#引入數(shù)據(jù)庫操作對象fromapp.dao.ClassicsDaoimportClassicsDaofromapp.model.modelsimportClassictype,ClassictypeSchema#創(chuàng)建藍圖classics_blueprint=Blueprint("classics_blueprint",__name__) #獲取所有文學類型@classics_blueprint.route('/get-classictypes')defget_classictypes():
#返回信息
result_msg={"code":"200","msg":"操作成功!"}
…………
導入了文學數(shù)據(jù)庫操作類ClassicsDao,并利用其提供的getClassictypes()函數(shù)來查詢數(shù)據(jù)庫中所有的文學類型。
3.4.開發(fā)文學導航API接口2.業(yè)務功能實現(xiàn)(3)注冊文學藍圖打開“cls_svr”項目的/app/app.py文件。在該文件中,我們進行文學藍圖的注冊操作。以下是實現(xiàn)這一功能的關(guān)鍵代碼:......fromapp.api.classics_blueprintimportclassics_blueprint#注冊藍圖app.register_blueprint(classics_blueprint,url_prefix="/api/classics")
......在上述代碼中,我們導入了文學藍圖classics__blueprint,通過register_blueprint()注冊文學藍圖,藍圖的url_prefix="/api/classics",作為藍圖的URL規(guī)則。
3.4.開發(fā)文學導航API接口2.業(yè)務功能實現(xiàn)(4)“首頁”文學導航API接口測試項目啟動后,可以通過“:5000//api/classics/get-classictypes”進行訪問,測試結(jié)果如圖所示。
3.5.開發(fā)文學推薦API接口接下來,我們著手開發(fā)“首頁”文學推薦API接口。
3.5.開發(fā)文學推薦API接口1.需求描述
“首頁”文學推薦API接口主要用于初始化并呈現(xiàn)首頁的內(nèi)容。它會從數(shù)據(jù)庫中查詢出各類文學類型中星級評價最高的文學作品列表。隨后,它會將這些查詢出的文學信息列表返回給客戶端。在這一過程中,接口需要對數(shù)據(jù)庫中的文學類型表(classictype)和文學表(classics),進行高效且精準的數(shù)據(jù)查詢。該API接口的詳細說明,請參見課本表3.13。
3.5.開發(fā)文學推薦API接口2.業(yè)務功能實現(xiàn)接下來,我們將著手開發(fā)“首頁”文學推薦API接口。以下是具體的開發(fā)步驟。(1)開發(fā)數(shù)據(jù)操作模塊在“cls_svr”項目中,找到app/dao/ClassicsDao.py文件,在該文件中,開發(fā)文學查詢的功能,具體關(guān)鍵代碼如下所示:......fromapp.model.modelsimportClassics,ClassicsSchema#2.獲取文學列表(首頁推薦使用)defgetClassicsByIndex(self,tid,num):try:#排序查詢:所有文學按星級評價從高到低排序,取前num個classics=Classics.query.filter(Classics.tid==tid)......在上述代碼中,我們定義了一個名為getClassicsByIndex的函數(shù),該函數(shù)接收兩個參數(shù):tid和num,分別代表文學類型編號和推薦的文學數(shù)量。該函數(shù)會根據(jù)提供的tid參數(shù),在文學表(classics)中查詢相應類型的數(shù)據(jù),查詢結(jié)果會按照星級進行降序排列,以確保用戶最先看到的是評價最高的文學作品。之后,函數(shù)會選取排列后的前num條記錄,并以列表的形式返回。
3.5.開發(fā)文學推薦API接口2.業(yè)務功能實現(xiàn)(2)開發(fā)文學推薦邏輯在“cls_svr”項目中,找到位于app/api/classics_blueprint.py的文學藍圖文件,并開發(fā)文學推薦API接口。以下是關(guān)鍵代碼實現(xiàn):......fromapp.model.modelsimportClassics,ClassicsSchema#按文學類型,獲取推薦文學列表(首頁)@classics_blueprint.route('/recommend-classics/<int:num>')defrecommend_classics(num):#返回信息result_msg={"code":"200","msg":"操作成功!"}#判斷請求及參數(shù)是否正確............在上述代碼中,我們利用getClassictypes()函數(shù)查詢出所有的文學類型;接著,通過循環(huán)遍歷文學類型列表,獲取文學類型的編號tid,然后以tid為參數(shù)調(diào)用getClassicsByIndex()函數(shù)查詢對應的文學列表,將其加入rd_list列表中。最后我們將rd_list列表以JSON格式返回給客戶端。
3.5.開發(fā)文學推薦API接口2.業(yè)務功能實現(xiàn)(3)“首頁”文學推薦API接口測試項目啟動后,可以通過“:5000/api/classics/recommend-classics/6”進行訪問,測試結(jié)果如圖所示。
3.6.開發(fā)文學搜索API接口接下來,我們著手開發(fā)“首頁”文學搜索API接口。
3.6.開發(fā)文學搜索API接口1.需求描述
“首頁”文學搜索API接口的主要功能是為用戶提供一個搜索功能。當該接口被調(diào)用時,它會根據(jù)用戶輸入的關(guān)鍵字,在數(shù)據(jù)庫中查詢與之匹配的文學作品。在此過程中,接口將訪問文學表(classics),并將查詢到的文學信息返回給客戶端。該API接口的詳細說明,請參見課本表3.14。
3.6.開發(fā)文學搜索API接口2.業(yè)務功能實現(xiàn)接下來,我們將著手開發(fā)“首頁”文學搜索API接口。以下是具體的開發(fā)步驟。
3.6.開發(fā)文學搜索API接口(1)開發(fā)數(shù)據(jù)操作模塊
在“cls_svr”項目中,找到app/dao/ClassicsDao.py文件,在該文件中,開發(fā)文學搜索的功能,具體關(guān)鍵代碼如下所示:2.業(yè)務功能實現(xiàn)......#3.搜索文學列表(按文學標題搜索)defseachClassicsByKeyword(self,keyword):try:#按文學標題進行模糊查詢
classics=Classics.query.filter(Classics.title.contains(keyword)).all()returnclassicsexceptExceptionase:print(e)pass......
3.6.開發(fā)文學搜索API接口
在上述代碼中,我們定義了一個名為searchClassicsByKeyword(self,keyword)的函數(shù),該函數(shù)會根據(jù)查詢關(guān)鍵字對文學作品的搜索。函數(shù)將接收一個keyword參數(shù),即查詢關(guān)鍵字,函數(shù)會在文學表(classics)中查找標題包含該關(guān)鍵字的文學作品。2.業(yè)務功能實現(xiàn)
3.6.開發(fā)文學搜索API接口(2)開發(fā)文學搜索邏輯在“cls_svr”項目中,找到位于app/api/classics_blueprint.py的文學藍圖文件。在此文學藍圖中,我們將定義文學搜索API接口,用以查詢文學數(shù)據(jù)。以下是關(guān)鍵代碼實現(xiàn):2.業(yè)務功能實現(xiàn)......#按關(guān)鍵字,搜索文學列表(搜索)@classics_blueprint.route('/seach-classics',methods=["POST"])defseach_classics():result_msg={"code":"200","msg":"操作成功!"} #返回信息#獲取Json格式的請求,并解析JSONrequest_body=request.get_json()#判斷傳入的Json數(shù)據(jù)是否為空ifrequest.get_json()isNone:result_msg["code"]="404"result_msg["msg"]="參數(shù)錯誤"returnjsonify(result_msg)
3.6.開發(fā)文學搜索API接口接上頁代碼2.業(yè)務功能實現(xiàn)#獲取參數(shù)keyword=request_body.get("keyword")#進行搜索操作,創(chuàng)建數(shù)據(jù)庫操作對象db_op=ClassicsDao()#查詢文學列表classics=db_op.seachClassicsByKeyword(keyword)#many=True轉(zhuǎn)換多條數(shù)據(jù)classics_Schema=ClassicsSchema(many=True)classics_data=classics_Schema.dump(classics)#將轉(zhuǎn)換后的JSON格式數(shù)據(jù)存儲至返回結(jié)果result_msg["data"]=classics_data#返回操作結(jié)果returnjsonify(result_msg)......
3.6.開發(fā)文學搜索API接口
在上述代碼中,我們定義了search_classics()視圖函數(shù)。在該函數(shù)中,我們調(diào)用searc
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專項11 古詩文閱讀(解析版)
- 2025屆四川省成都市高三第二次診斷考試政治試題(原卷版+解析版)
- 《物聯(lián)網(wǎng)技術(shù)案例教程》課件-第8章46
- 勸學教學設計
- 四海省廣元市蒼溪縣2024-2025學年九年級上學期期末質(zhì)量監(jiān)測數(shù)學試題 (原卷版+解析版)
- 《跨境電商》課件-9.跨境店鋪優(yōu)化
- 《Linux操作系統(tǒng)》課件-1.認識Linux(全)
- 景區(qū)開發(fā)石子運輸合同樣本
- 項目協(xié)作與會議記錄會議紀要
- 廣告行業(yè)廣告投放手冊
- 2025年九省聯(lián)考新高考 英語試卷(含答案解析)
- 2025年高考化學復習策略講座
- 粵教板2019高中信息技術(shù)必修一全冊練習附答案
- 二人銷售合作協(xié)議書模板
- 食品經(jīng)營安全管理制度目錄
- 【中職數(shù)學】北師大版基礎模塊上冊 第4單元《指數(shù)函數(shù)與對數(shù)函數(shù)》4.4.2 對數(shù)函數(shù)的圖像與性質(zhì)(第10-11課時)教學設計
- 第14課推進綠色發(fā)展的課件
- 2024上海高考英語句子翻譯模擬試題及答案解析
- 網(wǎng)絡與信息安全管理員試題庫(附參考答案)
- 醫(yī)院等級評審醫(yī)療組現(xiàn)場檢查路徑
- 2024年江蘇海事職業(yè)技術(shù)學院單招職業(yè)適應性測試題庫及答案解析
評論
0/150
提交評論