簡體   English   中英

你如何在flask-restplus中將默認值傳遞給payload?

[英]How do you pass default values to payload in flask-restplus?

我正在設置一個 restplus API,並且希望在查詢不包含這些值時傳遞一些默認字段。 我如何使用 api 模型傳遞這些,最好不使用 requestParser?

就目前而言,有效載荷不會受到設置默認值的影響,因此沒有必要。 我已經嘗試制作所需的參數,但這沒有用,因為我希望能夠只傳遞預期有效載荷的一部分。

from flask import Flask, request
from flask_restplus import Api, Resource, fields

app = Flask(__name__)
api = Api(app=app)
model = api.model("simple_model", {'some_bool': fields.Boolean(required=False, default=False),
                                   'some_int': fields.Integer(required=False, default=99)})


@api.route('/foo')
class SomeClass(Resource):

    @api.expect(model)
    def post(self):
        return request.json


if __name__ == '__main__':
    app.run(host='localhost', port=8000, threaded=False, debug=True)

用代碼測試

import requests

query = {"some_bool": True, "some_int": 20}
res = requests.post("http://localhost:8000/foo", json=query)
print(res.json())

query = {"some_bool": True}
res = requests.post("http://localhost:8000/foo", json=query)
print(res.json())

query = {"some_int": 20}
res = requests.post("http://localhost:8000/foo", json=query)
print(res.json())

res = requests.post("http://localhost:8000/foo")
print(res.json())

這給出了輸出

{'some_bool': True, 'some_int': 20}

{'some_bool': True}

{'some_int': 20}
None

期望值和期望的輸出是

{'some_bool': True, 'some_int': 20}

{'some_bool': True, 'some_int': 99}

{'some_bool': False, 'some_int': 20}

{'some_bool': False, 'some_int': 99}

感謝所有幫助。

編輯:

在@IMCoins 回答之后,我最終編寫了一個函數,使我能夠像這樣訪問函數內的項目

def get_content(api_model):
   @marshal_with(api_model)
   def get_request():
      return request.json
   return get_request()

然后只是訪問里面的內容

content = get_content(model)

據我了解,如果您想確保在入口點擁有所需的所有密鑰,則需要使用RequestParser() api.expect()裝飾器用於記錄招搖。

但是,如果您想確保您的請求始終返回一個基本模板(類似於此處的模型),您可以在裝飾器api.marshal_with()使用您創建的模型。

例如,在這里的示例中,只需將expect替換為marshal_with ,它將在響應中包含缺失值。

我認為沒有請求解析器,就不可能得到你想要的。 這個默認關鍵字實際上並不是答案。 因為如果您嘗試使用 Logs 進行調試,它只會接收您作為查詢傳遞的信息。 但是隨后 api 沒有在缺少的情況下添加默認參數,所需的參數在那里也不起作用。 所以我想按照@IMCoins 上面的描述使用它?

jsonschema 實際上有一個解決方案......但不要將它包含在主庫中:

https://python-jsonschema.readthedocs.io/en/stable/faq/#why-doesn-t-my-schema-s-default-property-set-the-default-on-my-instance

schema = {'some_bool' {'type': 'bool', 'default': 'false'}, 'some_int': {'type': 'number', 'default': 99}}

def post()
   data = request.json
   DefaultValidatingDraft7Validator(schema).validate(data)
   return data

應該導致

res = requests.post("http://localhost:8000/foo")
print(res.json())
{'some_bool': False, 'some_int': 99}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM