0

我想使用 POST 动词在带有 flask-restplus 的 VM 上执行操作,但是当没有正文时它总是会导致 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 把自己画到一个角落里?

注意:对于需要主体的操作,它可以正常工作。它唯一的无体烧瓶-restplus 后操作在空体上出现 400 错误。

4

2 回答 2

0

如果您将内容类型设置为application/json我认为您的身体至少应该是{}. 如果您想提交一个空的有效负载,只需删除 content-type 标头即可。

我认为这正是这个问题(我试图弄清楚):https ://github.com/noirbizarre/flask-restplus/issues/84

于 2015-11-06T06:40:40.313 回答
0

这是一种解决方法,可以让我一直坚持到找到另一个解决方案:

@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
于 2015-11-07T20:07:27.210 回答