1. 程式人生 > >Flask-Restful

Flask-Restful

wtforms 就是 空格 false 判斷 form 很多 參數說明 nat

定義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
        })
    }

Flask-Restful