Я хотел бы использовать глагол POST для выполнения действий на виртуальной машине с flask-restplus, но это всегда приводит к 400, когда нет тела.
VM_ACTION_FIELDS = {
'vmActionId': fields.Integer(required=True, description='The vmActionId of the VmAction'),
'vmId': fields.Integer(required=True, description='The vmId of the VmAction'),
'status': fields.String(required=True, description='The status of the VmAction',
enum=['NEW', 'REQUESTED', 'IN_PROGRESS', 'ERROR', 'COMPLETED']),
'actionType': fields.String(required=True, description='The actionType of the VmAction',
enum=['STOP', 'RESTART']),
'createdAt': fields.DateTime(required=True,
description='The createdAt datetime of the VmAction'),
'completedAt': fields.DateTime(required=True,
description='The completedAt datetime of the VmAction'),
}
VM_ACTION_MODEL = api.model('VmAction', VM_ACTION_FIELDS)
[snip]
@vms_ns.route('/<int:vmId>/stop', endpoint='vmStop')
class VmStopView(Resource):
"""
Stop a VM
"""
@api.marshal_with(VM_ACTION_MODEL, code=202)
@api.doc(id='stopVm', description='Stop a Vm')
def post(self, vmId):
# do stuff
return vmAction, 202
Результат 400 { "message": "Браузер (или прокси) отправил запрос, который этот сервер не смог понять." }
Если я просто перехожу с post на get, все работает нормально. НО, я действительно хочу использовать для этого глагол POST, потому что это стандартный глагол, которому я должен следовать для пользовательских действий, не связанных с CRUD. Я загнал себя в угол с помощью flask-restplus?
Примечание: для операций, требующих тела, он отлично работает. Это единственная почтовая операция без тела flask-restplus, которая выдает ошибку 400 в пустом теле.
request.get_json(force=True, silent=True) or request.args
. Для моего приложения мне нужно было хотя бы попытаться разобрать json, но вернуться кrequest.args
.silent=True
заставляетget_json
возвращатьNone
, если возникают какие-либо ошибки при попытке проанализировать json. 08.12.2020