Web2py:通过Web2py调度程序中的Rest API调用发送JSON数据

时间:2018-06-08 11:23:00

标签: python-requests web2py web2py-modules

我有一个表单,其中一个字段是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.

但如果我从Outside(POSTMAN客户端甚至python请求)执行相同的请求,我会得到所需的结果。

当我尝试从表中获取数据时,数据类型是否出现问题。

1 个答案:

答案 0 :(得分:1)

power_response = requests.post(vm_power_op_url,
                               json=vm_power_opStatus_row_data)

vm_power_opStatus_row_data似乎已经是JSON编码的字符串。但是,json的{​​{1}}参数应该是Python对象,而不是字符串(requests.post()会自动将Python对象编码为JSON并适当地设置内容类型)。所以,上面应该是:

requests

或者,您可以使用power_response = requests.post(vm_power_op_url, json=json.loads(vm_power_opStatus_row_data)) 参数并将内容类型设置为JSON:

data

另请注意,在REST POST功能中,power_response = requests.post(vm_power_op_url, data=vm_power_opStatus_row_data, headers={'Content-Type': 'application/json') 已作为request.vars传递给函数,因此在函数中,您只需引用**vars而不是{{ 1}}。