(一)前言
最近在做自己的全棧項目的時候,免不了要自己做一個接口客燕。作為一名菜鳥的后端碼農(nóng),剛開始用的是MyEclipse 10 + Servlet來構(gòu)建自己的接口癞季,雖然這個IDE已經(jīng)給我提供了極大的便利(原來的作法)稍途,但是當(dāng)我知道Flask的時候我就知道:我已經(jīng)回不去了阁吝。
(二)萬年不變
1.簡介
在Python浩如煙海的框架中,有兩款著名的Web框架械拍,一個是Django突勇,另一個就是Flask射沟。正如Flask自身的介紹一樣:“A microframework”,相比較于Django它更加的輕量與靈活与境,更加適合于個人定制。類似于接口之類的比較迷你的需求猖吴,F(xiàn)lask更加適合摔刁,并且完全勝任。
2.安裝
安裝是最沒有意思的步驟了海蔽,網(wǎng)上教程一大堆共屈,所以博主就不再贅述了。小伙伴們可以看這里党窜。
(三)簡單初識
現(xiàn)在拗引,你的已經(jīng)安裝完Flask了,下面讓我們來初步使用一下它幌衣。
萬物萬事初始于“Hello world矾削!”。
from flask import Flaskfrom
app = Flask(__name__)
@app.route('/')
def start():
return 'Hello world豁护!'
if __name__ == '__main__':
app.run()
這就是一個最小的Flask程序哼凯,是不是簡單到爆炸?route裝飾器直接指定了URL楚里,后面的方法就是URL對應(yīng)的方法(這里是start方法)断部,直接一個return就返回了響應(yīng)的內(nèi)容。就是這么簡單班缎,就是這么粗暴蝴光。
訪問127.0.0.1:5000我們就可以看到響應(yīng)結(jié)果了
(四)構(gòu)建接口
1.目標(biāo)
在原來的服務(wù)端的功能中主要有三大功能:
- 根據(jù)頁碼和影片類型參數(shù),響應(yīng)一個視頻列表JSON數(shù)據(jù)达址;
- 根據(jù)頁碼蔑祟,響應(yīng)一個新聞列表JSON數(shù)據(jù);
- 根據(jù)關(guān)鍵詞沉唠,響應(yīng)一個相應(yīng)的數(shù)據(jù)列表的JSON數(shù)據(jù)做瞪;
由于其實這三個功能從實現(xiàn)邏輯上來講大同小異,所以本篇文章只以第一個功能作為例子進(jìn)行講解右冻。
我們先來看一下數(shù)據(jù)庫中的數(shù)據(jù):
這里需要解釋一下的是leve1和leve2装蓬,leve1是視頻的一層分類,包括動漫纱扭、紀(jì)錄片牍帚,學(xué)習(xí)等乳蛾,而leve2則是在leve1之下的細(xì)分。
博主計劃的SC交互過程是這樣的:客戶機發(fā)送一個POST請求,請求中包含index绩衷,leve1和leve2咳燕,參數(shù)乒躺。如果leve2不為空,那么根據(jù)leve2和index來查詢數(shù)據(jù)庫嘉冒,然后根據(jù)固定的json返回格式返回給客戶端讳推,就像這樣:
2.構(gòu)建
首先蜕衡,我們需要獲取客戶機POST請求中的參數(shù)慨仿,在Flask中我們可以輕松而又優(yōu)雅的獲取到:
index = request.args.get('index')
當(dāng)然我們也是需要考慮一個情況,那就是如果客戶機沒有傳遞這個參數(shù)那怎么辦跑慕?Flask也已經(jīng)替我們考慮了這個情況万皿,當(dāng)發(fā)生諸如此類的情況時,F(xiàn)lask會拋出一個KeyError的異常,我們只需要try...except處理如筛,返回一個表達(dá)錯誤的JSON就可以啦杨刨!
OK妖胀!在寫SQL語句之前我們還需要一個步驟捉撮,由于APP需要分頁功能,所以我們還需要計算頁碼闯估,在外部我們先定義一個單請求返回數(shù)據(jù)數(shù)(一個請求返回多少條數(shù)據(jù)):
pageCount = 20
現(xiàn)在讓我們來計算我們需要從哪一個數(shù)據(jù)開始查詢數(shù)據(jù)庫:
pageIndex = int(pageCount) * int(index)
注意:這里如果不進(jìn)行類型的轉(zhuǎn)換的話會發(fā)生一個錯誤骑素,當(dāng)index=0的時候是沒有問題的创橄,pageIndex=0醉蚁,但是當(dāng)index=1時鬼店,pageIndex=111111111111馍管,那就不對了。
現(xiàn)在我們來編寫SQL語句薪韩,當(dāng)leve2是空字符串的時候:
sql = 'select title,url from FreeVideo where leve1="%s" limit %s,%s' % (leve1,pageIndex,pageCount)
當(dāng)leve2不是空字符串的時候:
sql = 'select title,url from FreeVideo where leve2="%s" limit %s,%s' % (leve2,pageIndex,pageCount)
接下來復(fù)用之前爬蟲用的mysql類來進(jìn)行數(shù)據(jù)庫的連接和查詢mysql的代碼:
db = mysql.Mysql()
db.queryData(sql=sql)
獲取結(jié)果集進(jìn)行遍歷确沸,并且放入響應(yīng)結(jié)果數(shù)組中:
result = []
for item in result_mysql:
ji = {"title": item[0],"url":item[1]}
result.append(ji)
由于返回的JSON數(shù)據(jù)都包括三個字段:1.datas捌锭,這個字段包含返回的數(shù)據(jù)。2.msg:包含服務(wù)器返回的提示信息罗捎。3.success:包含操作結(jié)果成功還是失敼矍(BOOL類型)。因此我定義了一下基礎(chǔ)返回響應(yīng)的函數(shù):
def getBaseReturnValue(data,msg,code):
json_data = json.dumps({'datas':data,'msg':msg,'success':code},ensure_ascii=False,encoding='gb2312')
return json_data
注意:由于返回的數(shù)據(jù)中包含中文的數(shù)據(jù)桨菜,因此在運用json模塊中的dumps方法時必須加上encoding參數(shù)豁状,否則服務(wù)器會報錯!
終于倒得,最后一步泻红,根據(jù)響應(yīng)數(shù)據(jù)的長度決定返回的數(shù)據(jù):
if len(result) == 0:
return getBaseReturnValue(data=result,msg="沒有更多數(shù)據(jù)!",code=False)
else:
return getBaseReturnValue(data=result,msg='OK',code=True)
(五)結(jié)語
我們來看一下最后的APP使用接口的效果:
最后的最后,github地址附上霞掺,所有的代碼都在這里谊路!iCCUT-Server-Flask