Web2py: отправка данных JSON через пост-вызов Rest API в планировщике Web2py
У меня есть форма, одно поле которой типа IS_JSON
db.define_table('vmPowerOpsTable',
Field('launchId',label=T('Launch ID'),default =datetime.datetime.now().strftime("%d%m%y%H%M%S")),
Field('launchDate',label=T('Launched On'),default=datetime.datetime.now()),
Field('launchBy',label=T('Launched By'),default = auth.user.email if auth.user else "Anonymous"),
Field('inputJson','text',label=T('Input JSON*'),
requires = [IS_NOT_EMPTY(error_message='Input JSON is required'),IS_JSON(error_message='Invalid JSON')]),
migrate=True)
Когда пользователь отправляет эту форму, эти данные также одновременно вставляются в другую таблицу.
db.opStatus.insert(launchId=vmops_launchid,launchDate=vmops_launchdate
,launchBy=vmops_launchBy,opsType=operation_type,
opsData=vmops_inputJson,
statusDetail="Pending")
db.commit()
Теперь из планировщика я пытаюсь получить эти данные и сделать запрос POST.
vm_power_opStatus_row_data = vm_power_opStatus_row.opsData
Обратите внимание, на приведенном выше шаге я могу получить данные. (Я вставил его в БД и увидел, что поле точно соответствует тому, что ввел пользователь.
Затем из планировщика я делаю POST.
power_response = requests.post(vm_power_op_url, json=vm_power_opStatus_row_data)
Запрос POST обрабатывается функцией моего контроллера.
Функция контроллера:
@request.restful()
def vmPowerOperation():
response.view = 'generic.json'
si = None
def POST(*args, **vars):
jsonBody = request.vars
print "Debug 1"+ str(jsonBody) ##-> Here it returns blank in jsonBody.
Но если я сделаю тот же запрос извне (клиент POSTMAN или даже запрос Python), я получу желаемый результат.
Что-то не так с типом данных, когда я пытаюсь получить его из таблицы.
1 ответ
power_response = requests.post(vm_power_op_url, json=vm_power_opStatus_row_data)
Похоже, что vm_power_opStatus_row_data
это уже строка в кодировке JSON. Тем не менее json
аргумент requests.post()
должен быть объектом Python, а не строкой (requests
автоматически закодирует объект Python в JSON и соответствующим образом установит тип содержимого). Итак, вышесказанное должно быть:
power_response = requests.post(vm_power_op_url,
json=json.loads(vm_power_opStatus_row_data))
Кроме того, вы можете использовать data
аргумент и установите тип содержимого JSON:
power_response = requests.post(vm_power_op_url,
data=vm_power_opStatus_row_data,
headers={'Content-Type': 'application/json')
Также обратите внимание, что в вашей функции REST POST request.vars
уже передана функции как **vars
в рамках функции вы можете просто обратиться к vars
скорее, чем request.vars
,