Flask-restplus 如何 post 没有 body
Flask-restplus how to post without a body
我想使用 POST 动词在具有 flask-restplus 的 VM 上执行操作,但是当没有 body 时它总是导致 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": "The browser (or proxy) sent a request that this server could not understand."
}
如果我简单地从 post 更改为 get,它工作正常。但是,我真的想为此使用 POST 动词,因为这是我需要遵循的标准动词,用于自定义 non-CRUD 操作。我是不是用 flask-restplus 把自己逼到墙角了?
注意:对于需要 body 的操作,它工作正常。只有 bodyless flask-restplus post 空 body.
时出现 400 错误的操作
如果您将 content-type 设置为 application/json
,我认为您 body 至少应该 {}
。
如果要提交空负载,只需删除 content-type header.
我认为这正是这个问题(我正在努力弄清楚):https://github.com/noirbizarre/flask-restplus/issues/84
这里有一个解决方法,可以让我坚持到找到另一个解决方案:
@app.before_request
def before_request():
"""This is a workaround to the bug described at
https://github.com/noirbizarre/flask-restplus/issues/84"""
ctlen = int(request.headers.environ.get('CONTENT_LENGTH', 0))
if ctlen == 0:
request.headers.environ['CONTENT_TYPE'] = None
我想使用 POST 动词在具有 flask-restplus 的 VM 上执行操作,但是当没有 body 时它总是导致 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": "The browser (or proxy) sent a request that this server could not understand." }
如果我简单地从 post 更改为 get,它工作正常。但是,我真的想为此使用 POST 动词,因为这是我需要遵循的标准动词,用于自定义 non-CRUD 操作。我是不是用 flask-restplus 把自己逼到墙角了?
注意:对于需要 body 的操作,它工作正常。只有 bodyless flask-restplus post 空 body.
时出现 400 错误的操作如果您将 content-type 设置为 application/json
,我认为您 body 至少应该 {}
。
如果要提交空负载,只需删除 content-type header.
我认为这正是这个问题(我正在努力弄清楚):https://github.com/noirbizarre/flask-restplus/issues/84
这里有一个解决方法,可以让我坚持到找到另一个解决方案:
@app.before_request
def before_request():
"""This is a workaround to the bug described at
https://github.com/noirbizarre/flask-restplus/issues/84"""
ctlen = int(request.headers.environ.get('CONTENT_LENGTH', 0))
if ctlen == 0:
request.headers.environ['CONTENT_TYPE'] = None