Python中Flask-RESTful編寫API介面(小白入門)
1.API介面:hello world 案例
from flask import Flask from flask_restful import Api,Resource app = Flask(__name__) api = Api(app) class HelloWorld(Resource): def get(self): return {'hello': 'world'} api.add_resource(HelloWorld,'/') if __name__ == '__main__': app.run(debug=True)
2.API介面:Resource充當路由的角色
官方文件的說法:
Flask-RESTful 提供的最主要的基礎就是資源(resources)。資源(Resources)是構建在 Flask 可拔插檢視 之上,只要在你的資源(resource)上定義方法就能夠容易地訪問多個 HTTP 方法.
其實就是想表達,在資源路由上(resources)定義多個方法(get,post,put等),就可以實現多種效果
from flask import Flask,request from flask_restful import Api,Resource app = Flask(__name__) api = Api(app) todos = {} class TodoSimple(Resource): def get(self,todo_id): return {todo_id: todos[todo_id]} def put(self,todo_id): todos[todo_id] = request.form['data'] return {todo_id: todos[todo_id]} api.add_resource(TodoSimple,'/<string:todo_id>') if __name__ == '__main__': app.run(debug=True)
解釋:
(1)TodoSimple類定義了2種方法,最終地址/string:todo_id'下面,就可以實現2種請求方法
(2)add_resource方法中第一個引數:檢視函式名;第二個引數:路由的具體地址,以及string:todo_id代表傳遞的是一個字串,且是必要引數。
(3)request.form[‘data']獲取request裡面,form表單的key為data的引數,如果request裡面,沒有data引數,那報錯。如果有包含data的多個引數,那也只會取data這一個引數
step1:為字典todos定義引數,key為todo1
step2:獲取todos裡面的todo1的引數
step3:更新老的資料,多傳遞其他引數
step4:獲取最新的引數:
step5:不傳遞data引數,檢視報錯情況:
3.API介面:endpoint(埠)的理解:
這個問題詳情可以參考如下博文,已經解釋很詳細了:
https://www.jb51.net/article/176173.htm
簡單理解是:
url通過endpoint來去查詢檢視函式(通常endpoint的名字與檢視函式名一致),但是如果不一致的時候,就需要有針對性的指定某個檢視函式去執行,也或者多個藍圖裡面有一樣的檢視函式的場景下,需要指定具體的endpoint
4.API介面:引數解析
官方文件:
(1)儘管 Flask 能夠簡單地訪問請求資料(比如查詢字串或者 POST 表單編碼的資料),驗證表單資料仍然很痛苦。Flask-RESTful 內建了支援驗證請求資料,它使用了一個類似 argparse 的庫。
(2)需要注意地是與 argparse 模組不同,reqparse.RequestParser.parse_args() 返回一個 Python 字典而不是一個自定義的資料結構。
from flask import Flask from flask_restful import reqparse,abort,Api,Resource app = Flask(__name__) api = Api(app) parser = reqparse.RequestParser() parser.add_argument('task',type=str) parser.add_argument('name',type=str) # 獲取 & 更新 class Get_Modify(Resource): def post(self): args = parser.parse_args() print(args) return args,201 api.add_resource(Get_Modify,'/get_modify') if __name__ == '__main__': app.run(debug=True)
step1:從form表單裡面獲取定義的引數
解釋:
即使傳遞其他引數,最終也只會讀取定義的2個引數的值
通過如上程式碼說明:reqparse.RequestParser.parse_args(),即如上的args可以獲取到request的form表單的引數,最終是一個字典
5.API介面:案例一(在form表單裡面傳遞引數)
from flask import Flask from flask_restful import reqparse,Resource app = Flask(__name__) api = Api(app) Tasks = { 't1': {'task': 'eat an app'},'t2': {'task': 'play football'},'t3': {'task': 'watching TV'},} def abort_if_todo_doesnt_exist(t_id): if t_id not in Tasks: abort(404,message="Todo {} doesn't exist".format(t_id)) parser = reqparse.RequestParser() parser.add_argument('task',type=str) # 獲取 & 更新 class Get_Modify(Resource): def get(self): return Tasks def post(self): args = parser.parse_args() t_id = int(max(Tasks.keys()).lstrip('t')) + 1 t_id = 't%i' % t_id Tasks[t_id] = {'task': args['task']} return Tasks[t_id],201 # 設定每個檢視函式的訪問格式 api.add_resource(Get_Modify,'/get_modify') if __name__ == '__main__': app.run(debug=True)
解釋:
(1)如上的函式,get是獲取總的列表Tasks
(2)post是新增最新的一個key的值,且key的值是以“t”開頭,數字自增的一種形式
(3)max(Tasks.keys())這個可以獲取到Tasks列表裡面,索引最大的key值,在沒新增的時候,索引最大為t3
(4)x_string.lstrip(‘t'),這個可以擷取x_string字串裡面以't'開始的剩餘字串。例如t3最終得到3,最終int(max(Tasks.keys()).lstrip(‘t')) + 1這一行的意思是,得到列表最大的一個key的索引,然後自增到下一個。
(5)在希望在form表單裡面傳遞引數,需要在函式裡面,使用args = parser.parse_args()接收傳遞的引數,具體key值通過add_argument函式設定
step1:第一次get請求,獲取原始的Tasks列表
step2:第二次post請求,新增value的值為studying,且第三次get請求,檢視最新Tasks
6.API介面:案例二(通過url裡面的引數作為查詢的引數)
from flask import Flask from flask_restful import reqparse,} def abort_if_todo_doesnt_exist(t_id): if t_id not in Tasks: abort(404,type=str) # 更新 & 刪除 任務 class Updata_Delete(Resource): def get(self,t_id): # 根據t_id獲取對應的value abort_if_todo_doesnt_exist(t_id) return Tasks[t_id] def delete(self,t_id): # 根據t_id刪除對應的value abort_if_todo_doesnt_exist(t_id) del Tasks[t_id] return 'delete success',204 def post(self,t_id): # 判斷t_id是否存在,並返回Tasks整個列表 abort_if_todo_doesnt_exist(t_id) return Tasks,201 def put(self,t_id): # 根據t_id新增對應的value,並返回所有值 args = parser.parse_args() task = {'task': args['task']} Tasks[t_id] = task return Tasks,201 api.add_resource(Updata_Delete,'/update_delete/<t_id>') if __name__ == '__main__': app.run(debug=True)
step1:檢視Tasks完整資訊
step2:新增資訊key值為:t5,內容為:studying
step3:檢視t5值的情況
step4:刪除t1的值,然後檢視Tasks的完整資訊
解釋:
(1)通過url傳遞引數,給檢視函式,這種方式一般用在get請求,post請求通過form表單形式比較實用
(2)通過url傳遞引數,需要定義函式時候,使用形參t_id,且在使用add_resource()函式的使用,url引數形式最後新增<t_id>變數,例如'/update_delete/<t_id>'這個形式。
(3)delete這個函式,最終執行刪除是成功的,但是最終並沒有返回return的字串"delete success",具體原因不詳,可能是用法不對,後續再更新中說明.
(return ‘delete success',204 將 204去掉即可)
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。