介紹:
Flask-Restful是一個專門用來寫restful api的一個插件荧嵌。使用他可以快速的集成restful api功能晒来。在app的后臺以及純api的后臺中印屁,這個插件可以幫助我們節(jié)省很多時間雨膨。當然幕垦,如果在普通的網(wǎng)站中岳遥,這個插件就顯得有些雞肋了奕翔,因為在普通的網(wǎng)頁開發(fā)中,是需要去渲染HTML代碼的浩蓉,而Flask-Restful在每個請求中都是返回json格式的數(shù)據(jù)派继。
安裝:
Flask-Restful需要在Flask 0.8以上的版本,在Python2.6或者Python3.3上運行捻艳。通過pip install flask-restful即可安裝驾窟。
定義Restful的視圖:
如果使用Flask-Restful,那么定義視圖函數(shù)的時候认轨,就要繼承自flask_restful.Resource類绅络,然后再根據(jù)當前請求的method來定義相應(yīng)的方法。比如期望客戶端是使用get方法發(fā)送過來的請求,那么就定義一個get方法恩急。類似于MethodView杉畜。示例代碼如下:
from flask import Flask,render_template,url_for
from flask_restful import ?Api,Resource
app = Flask(__name__)
# 用Api來綁定
appapi = Api(app)
class IndexView(Resource):
????defget(self):
????????return{"username":"zhiliao"}
api.add_resource(IndexView,'/',endpoint='index')
注意事項:
1、endpoint是用來給url_for反轉(zhuǎn)url的時候指定的衷恭。如果不寫endpoint此叠,那么將會使用視圖的名字的小寫來作為endpoint。
2随珠、dd_resource的第二個參數(shù)是訪問這個視圖函數(shù)的url灭袁,這個url可以跟之前的route一樣,可以傳遞參數(shù)窗看。并且還有一點不同的是茸歧,這個方法可以傳遞多個url來指定這個視圖函數(shù)。
參數(shù)解析:
Flask-Restful插件提供了類似WTForms來驗證提交的數(shù)據(jù)是否合法的包烤芦,叫做reqparse。以下是基本用法:
parser = reqparse.RequestParser()
parser.add_argument('username',type=str,help='請輸入用戶名')
args = parser.parse_args()
add_argument可以指定這個字段的名字析校,這個字段的數(shù)據(jù)類型等构罗。以下將對這個方法的一些參數(shù)做詳細講解:
default:默認值,如果這個參數(shù)沒有值智玻,那么將使用這個參數(shù)指定的值遂唧。
required:是否必須。默認為False吊奢,如果設(shè)置為True盖彭,那么這個參數(shù)就必須提交上來。
type:這個參數(shù)的數(shù)據(jù)類型页滚,如果指定召边,那么將使用指定的數(shù)據(jù)類型來強制轉(zhuǎn)換提交上來的值。
choices:選項裹驰。提交上來的值只有滿足這個選項中的值才符合驗證通過隧熙,否則驗證不通過。
help:錯誤信息幻林。如果驗證失敗后贞盯,將會使用這個參數(shù)指定的值作為錯誤信息。
trim:是否要去掉前后的空格沪饺。
其中的type躏敢,可以使用python自帶的一些數(shù)據(jù)類型,也可以使用flask_restful.inputs下的一些特定的數(shù)據(jù)類型來強制轉(zhuǎn)換整葡。比如一些常用的:
url:會判斷這個參數(shù)的值是否是一個url件余,如果不是,那么就會拋出異常。
regex:正則表達式蛾扇。
date:將這個字符串轉(zhuǎn)換為datetime.date數(shù)據(jù)類型攘烛。如果轉(zhuǎn)換不成功,則會拋出一個異常镀首。
輸出字段:
對于一個視圖函數(shù)坟漱,你可以指定好一些字段用于返回。以后可以使用ORM模型或者自定義的模型的時候更哄,他會自動的獲取模型中的相應(yīng)的字段芋齿,生成json數(shù)據(jù),然后再返回給客戶端成翩。這其中需要導(dǎo)入flask_restful.marshal_with裝飾器觅捆。并且需要寫一個字典,來指示需要返回的字段麻敌,以及該字段的數(shù)據(jù)類型栅炒。示例代碼如下:
class ProfileView(Resource):
????resource_fields = {'username': fields.String,'age': fields.Integer,'school': fields.String? ? }? ?
????@marshal_with(resource_fields)
????defget(self,user_id):
????????user = User.query.get(user_id)
????????return user
在get方法中,返回user的時候术羔,flask_restful會自動的讀取user模型上的username以及age還有school屬性赢赊。組裝成一個json格式的字符串返回給客戶端。
重命名屬性:
很多時候你面向公眾的字段名稱是不同于內(nèi)部的屬性名级历。使用 attribute可以配置這種映射释移。比如現(xiàn)在想要返回user.school中的值,但是在返回給外面的時候寥殖,想以education返回回去玩讳,那么可以這樣寫:
resource_fields = {
????'education': fields.String(attribute='school')
}
默認值:
在返回一些字段的時候,有時候可能沒有值嚼贡,那么這時候可以在指定fields的時候給定一個默認值熏纯,示例代碼如下:
resource_fields = {
????'age': fields.Integer(default=18)
}
復(fù)雜結(jié)構(gòu):
有時候想要在返回的數(shù)據(jù)格式中,形成比較復(fù)雜的結(jié)構(gòu)粤策。那么可以使用一些特殊的字段來實現(xiàn)豆巨。比如要在一個字段中放置一個列表,那么可以使用fields.List掐场,比如在一個字段下面又是一個字典往扔,那么可以使用fields.Nested。以下將講解下復(fù)雜結(jié)構(gòu)的用法:
class ProfileView(Resource):
resource_fields = {'username': fields.String,
????age': fields.Integer,
????'school': fields.String,
????'tags': fields.List(fields.String),
????'more': fields.Nested({
????????'signature': fields.String})? ?
}