我一直停留在這個有一段時間了。我的問題是我需要能夠使用marshal_with並驗證來自POST的嵌套字段。我的測試是這樣的:燒瓶寧靜,marshal_with +嵌套數據
def test_user_can_apply_with_multiple_dogs(self):
data = {
# User data
'registration_type': "guest",
'first_name': 'Alex',
'last_name': 'Daro',
'phone_number': '805-910-9198',
'street': '13950 NW Passage',
'street2': '#208',
'city': 'Marina del Rey',
'state': 'CA',
'zipcode': '90292',
'photo': 'test_image.png',
'how_did_you_hear': 0,
#Dog data
'pets': [
{
'dog_photo': "dog.png",
'name': 'Genghis Khan',
'breed': 'Shih Tzu',
'age': 'Puppy',
'size': 'Small',
},
{
'dog_photo': "dog2.png",
'name': 'Archibald',
'breed': 'Great Dane',
'age': 'Adult',
'size': 'Extra Large',
},
]
}
resp = self.client.post('/profile/registration', data=json.dumps(data))
self.assertEqual(resp.status_code, 200)
和我的端點類看起來是這樣的:
nested_fields = {
'dog_photo': fields.String,
'name': fields.String,
'breed': fields.String,
'age': fields.String,
'size': fields.String,
}
profile_fields = {
# 'user_email':fields.String,
'token': fields.String,
'registration_type': fields.String,
'first_name': fields.String,
'last_name': fields.String,
'phone_number': fields.String,
'street': fields.String,
'street2': fields.String,
'city': fields.String,
'state': fields.String,
'zipcode': fields.Integer,
'photo': fields.String,
'how_did_you_hear': fields.String,
#Dog data
'pets': fields.Nested(nested_fields)
}
class GuestProfile(Resource):
@marshal_with(profile_fields)
def post(self):
# User data
parser = reqparse.RequestParser()
parser.add_argument('registration_type', type=str)
parser.add_argument('first_name', type=str, required=True, help="First Name cannot be blank.")
parser.add_argument('last_name', type=str, required=True, help="Last Name cannot be blank.")
parser.add_argument('phone_number', type=str, required=True, help="Phone Number cannot be blank.")
parser.add_argument('street', type=str, required=True, help="Street cannot be blank.")
parser.add_argument('street2', type=str)
parser.add_argument('city', type=str, required=True, help="City cannot be blank.")
parser.add_argument('state', type=str, required=True, help="State cannot be blank.")
parser.add_argument('zipcode', type=str, required=True, help="Zipcode cannot be blank.")
parser.add_argument('photo', type=str, required=True, help="Please select a photo.")
parser.add_argument('how_did_you_hear', type=str, required=True, help="How did you hear about us cannot be "
"blank.")
parser.add_argument('pets', type=str)
kwargs = parser.parse_args()
print kwargs, "KWWW"
kwargs [ '寵物']總是在爲None
。有人有主意嗎?
應停止使用'型= str'。我通過打印語句收集您使用Python 2,因此您的解析器將無法處理unicode。如果完全刪除'type'參數,則默認類型將是一個unicode字符串。 – Josh
@Josh謝謝你的評論,這是有道理的,但它似乎沒有幫助。你是否知道任何一個使用marshal_with/reqparse和嵌套對象列表的例子/文檔? –
您也可以通過不爲每個請求實例化一個新的'RequestParser'來清理代碼。將它們放在模塊級別是完全正確的。 – Josh