12.Flask-Restful


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM