上一篇我們講到了flask的初步搭建,本章將講解flask實現api接口以及get與post請求的演示,
新手搭建flask框架並啟動以及flask啟動接口地址的修改
一、注解介紹
在寫代碼之前呢,我們先來介紹幾個“注解”,在Python中叫“裝飾器”。
裝飾器其實就是在一個函數內部定義另外一個函數,然后返回一個新的函數,即動態的給一個對象添加額外的職責。還沒明白的話,呃呃呃...先記着功能吧。
1、@app.route()
在flask中,@app.route()的作用主要是注冊路徑,相當於是一個路由。
我們所見到的接口路徑是http://127.0.0.2:8088/aaa/bbb,而在app.py中我們可以利用@app.route()幫助我們實現/aaa/這一層的路徑標識。
例如:@app.route('/aaa')所訪問的接口就是http://127.0.0.2:8088/aaa/

2、@infoModule.route()
在flask中,@infoModule.route()的作用主要也是注冊路徑。
他可以幫助我們區分是哪個模塊的路徑,例如:http://127.0.0.2:8088/aaa/bbb/中的bbb
二、flask藍圖(Blueprint)
在此演示的只是接口的開發與調用,我們通常使用的接口路徑為:“ip:端口號/模塊名/接口名”的方式,在很多系統開發中,會有很多的模塊,有很多人會想到在app.py中寫很多個@app.route()來解決,但這樣會將來維護代碼會非常麻煩,而且容易出錯。這時就要用到flask內置了一個模塊化處理的類,即flask藍圖(Blueprint)。
Blueprint 是一個存儲操作方法的容器,這些操作在這個Blueprint 被注冊到一個應用之后就可以被調用,Flask 可以通過Blueprint來組織URL以及處理請求。
藍圖的使用:
1、創建一個藍圖對象
在controller文件中創建一個藍圖對象:
testModule = Blueprint('testModule',__name__)
2、在app.py中注冊路由,生成應用對象
app = Flask(__name__)
@app.route('/') def hello_world(): return 'flask_test is running!!!'
3、在應用對象中注冊這個藍圖對象
app.register_blueprint(testModule, url_prefix='/testModule')
當這個應用啟動后,通過/testModle/可以訪問到藍圖中定義的視圖函數
三、接口開發
前期准備:
首先在項目根目錄下面創建一個controller文件夾,然后創建一個test_controller.py的文件(名字自定義都行,等會import時注意路徑就行)。

test_controller.py文件的編寫:
import json import datetime from flask import Blueprint,url_for,request,render_template,session,redirect # 創建了一個藍圖對象 testModule = Blueprint('testModule',__name__)
app.py文件的編寫:
from flask import Flask from controller.test_controller import testModule app = Flask(__name__)
app.register_blueprint(testModule, url_prefix='/testModule') @app.route('/') def hello_world(): return 'flask_test is running!!!' if __name__ == '__main__': app.run(port=8088)
完成以上准備工作后就可以進行接口的開發,只需要在test_controller.py文件中添加如下代碼即可:
1、GET請求無參數
""" GET請求,不帶參數 """ @testModule.route("/get_test1",methods=["GET"]) def get_test1(): # 默認返回內容 return_dict = {'return_code': '200', 'return_info': '處理成功', 'result': None} return json.dumps(return_dict, ensure_ascii=False)
效果:

2、GET請求,帶參數
""" GET請求,帶參數 """ @testModule.route("/get_test2",methods=["GET"]) def get_test2(): # 默認返回內容 return_dict = {'return_code': '200', 'return_info': '處理成功', 'result': None} # 判斷入參是否為空 if len(request.args) == 0: return_dict['return_code'] = '5004' return_dict['return_info'] = '請求參數為空' return json.dumps(return_dict, ensure_ascii=False) # 獲取傳入的params參數 get_data = request.args.to_dict() name = get_data.get('name') age = get_data.get('age') return_dict['result'] = "%s今年%s歲:%s" %(name,age,datetime.datetime.now()) return json.dumps(return_dict, ensure_ascii=False)
效果:

3、POST請求,帶參數
""" POST請求,帶參數 """ @testModule.route("/post_test1", methods=["POST"]) def post_test1(): #默認返回內容 return_dict = {'return_code':'200','return_info':'處理成功','result':None} # 判斷傳入的json數據是否為空 if len(request.get_data()) == 0: return_dict['return_code'] = '5004' return_dict['return_info'] = '請求參數為空' return json.dumps(return_dict, ensure_ascii=False) name = request.values.get('name') age = request.values.get('age') # 對參數進行操作 return_dict['result'] = "%s今年%s歲:%s" %(name,age,datetime.datetime.now()) print(return_dict) return json.dumps(return_dict,ensure_ascii=False)
效果:

四、小結
GET請求與POST請求獲取參數的方式不同,所以在獲取參數時需要注意設定的請求類型,出於安全考慮,一般一般只用POST請求傳參。
