Nano Hash - криптовалюты, майнинг, программирование

Flask-restplus как постить без тела

Я хотел бы использовать глагол 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 в пустом теле.


Ответы:


1

Если вы устанавливаете тип содержимого на application/json, я думаю, что ваше тело должно быть как минимум {}. Если вы хотите отправить пустую полезную нагрузку, просто удалите заголовок типа контента.

Я думаю, что это именно эта проблема (в которой я пытаюсь разобраться): https://github.com/noirbizarre/flask-restplus/issues/84

06.11.2015
  • Да, это именно оно. Мне не нужно было устанавливать для тела значение {}, но если я удалю --header Content-Type: application/json, это сработает! Я вижу, вы добавили это как веху 0.8.1. Это потрясающе, спасибо. 07.11.2015
  • Я столкнулся с этой проблемой и в итоге использовал следующий request.get_json(force=True, silent=True) or request.args. Для моего приложения мне нужно было хотя бы попытаться разобрать json, но вернуться к request.args. silent=True заставляет get_json возвращать None, если возникают какие-либо ошибки при попытке проанализировать json. 08.12.2020

  • 2

    Вот обходной путь, который работает для меня, чтобы удержать меня, пока не будет найдено другое решение:

    @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
    
    07.11.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..