定義Restful的視圖
安裝:pip install flask-restful
如果使用Flask-restful,那么定義視圖函數的時候,就要繼承flask_restful.Resourse類,然后再根據當前請求的method來定義相應的方法。比如期望客戶端是使用get方法發送過來的請求,那么就定義一個get方法。
from flask import Flask from flask_restful import Api,Resource app = Flask(__name__) api = Api(app) #用Api來綁定app class LoginView(Resource): def post(self): return {'username':'derek'} api.add_resource(LoginView,'/login/',endpoint="login") @app.route('/') def index(): return 'Hello World!' if __name__ == '__main__': app.run(debug=True)
說明:
- 從flask_restful中導入一個Api,來創建一個api對象。
- 寫一個視圖函數,讓它繼承自Resource,然后定義相應的方法。
- endpoint是用來給url_for反轉url的時候指定的。如果不寫endpoint,那么將會視圖函數的名字的小寫來作為endpoint.
- add——resource的第二個參數是訪問這個視圖函數的url,這個url跟之前的route一樣,可以傳遞參數,並且還有一點不同的是,這個方法可以傳遞多個url來指定這個視圖函數。
- 如果想返回json數據,那么就是用flask_restful,如果是渲染模板,還是采用之前的方式。
參數認證
Flask-Restful插件提供了類似WTForms來驗證提交的數據是否合法的包,叫做reqparse。
from flask import Flask from flask_restful import Api,Resource,reqparse,inputs app = Flask(__name__) api = Api(app) class LoginView(Resource): def post(self): parser = reqparse.RequestParser() parser.add_argument('username',type=str,help='用戶名驗證錯誤',default='xxx',trim=True) parser.add_argument('password',type=str,help='密碼驗證錯誤',required=True) parser.add_argument('gender',type=str,choices=['male','famale']) parser.add_argument('home_page',type=inputs.url,help=('個人中心鏈接錯誤')) parser.add_argument('birthday',type=inputs.date) args = parser.parse_args() print(args) return {'username':'derek'} api.add_resource(LoginView,'/login/',endpoint="login") @app.route('/') def index(): return 'Hello World!' if __name__ == '__main__': app.run(debug=True)
參數說明:
- default:默認值,如果這個參數沒有值,那么將使用這個參數指定的值。
- required:是否必須。默認為False,如果設置為True,那么這個參數就必須提交上來。
- type:這個參數的數據類型,如果指定,那么將使用指定的數據類型來強制轉換提交上來的值。
- choices:選項。提交上來的值只有滿足這個選項中的值才符合,否則驗證不通過。
- help:錯誤信息。如果驗證失敗后,將會使用這個參數指定的值作為錯誤信息。
- trim:是否去掉前后空格。
其中的type,可以使用python自帶的一些數據類型,也可以使用flask_restful.inputs下的一些特定的數據類型來強制轉換。比如一些常用的:
- url:會判斷這個參數的值是否是一個url,如果不是,就會拋出異常。
- regex:正則表達式。
- date:將這個字符串轉換為datetime.date數據類型,如果轉換不成功,則會拋出一個異常。
標准化返回參數
輸出字段
對於一個視圖函數,你可以指定好一些字段用於返回。以后可以使用orm模型或者自定義的模型的時候,它會自動的獲取模型的相應的字段,生成json數據,然后再返回給客戶端。這其中需要導入flask_restful.marshal_with裝飾器。並且需要些一個字典,來指示需要返回的字段,以及該字段的數據類型。
簡單實例:
from flask_restful import Resource,fields,marshal_with class ProfileView(Resource): resource_fields = { 'username':fields.String, 'age':fields.Integer 'school':fields.String } @marshal_with(resource_fields) def get(self,user_id): user = User.query.get(user_id) return user
在get方法中,返回user的時候,flask_restful會自動的讀取user模型上的username以及age屬性。組成一個json格式的字符串返回給客戶端。
重命名屬性
很多時候你面向公眾的字段名稱是不同於內部的屬性名,使用attribute可以配置這種映射。比如現在想要返回user.sckool的值,但是在返回給外面的時候,想以education返回回去,那么可以這樣寫:
resource_fields = { 'username':fields.String, 'age':fields.String 'education':fields.String(attribute='school') #重命名屬性 }
默認值
在返回一些字段的時候,有時候可能沒有值,那么這時候可以指定fields的時候給定一個默認值。
resource_fields = { 'username':fields.String, 'age':fields.Integer(default=18), # 默認值 'education':fields.String(attribute='school') }
復雜結構
有時候想要在返回的數據格式中,形參比較復雜的結構。那么可以使用一些特殊的字段來實現。比如要在一個字段中防止一個列表,那么可以使用fields.list;比如在一個字段下面又是一個字典,那么可以使用fields.Nested.
簡單實例:
resource_fields = { 'username':fields.String, 'age':fields.Integer(default=18), # 默認值 'education':fields.String(attribute='school'), #重命名屬性 'tags':fields.List(fields.String), 'more':fields.Nested({ 'signature':fields.String }) }