猿问

Web2Py POST 失败

Web2Py POST 失败


将一些字典数据发布到 Web2py。某些数据 POSTS 始终成功,某些数据 POSTS 始终失败。


此数据始终成功 POST:


data = {"batt chrg": {

            "dat": "-999%",

            "measurement": "percent",

            "unit": "electric",

            "entrytype": "subunitStatus"

            },

         "pv gen": {

             "dat": "-999 W",

             "measurement": "level",

             "unit": "electric",

             "entrytype": "subunitStatus"

             }

         }

此数据(更长的字典)始终无法发布:


data = {"download": {

            "entrytype": "subunitStatus",

            "dat": "9 Mbit/s",

            "measurement": "level",

            "unit": "comms"},

        "batt chrg": {

            "entrytype": "subunitStatus",

            "dat": "94.4%",

            "measurement": "percent",

            "unit": "electric"},

         "pv gen": {

             "entrytype": "subunitStatus",

             "dat": "543 W",

             "measurement": "level",

             "unit": "electric"},

         "living space": {

             "entrytype": "subunitStatus",

             "dat": "72 F",

             "measurement": "level",

             "unit": "hvac"},

         "ping": {

             "entrytype": "subunitStatus",

             "dat": "60 ms",

             "measurement": "level",

             "unit": "comms"},

         "invert load": {

             "entrytype": "subunitStatus",

             "dat": "402 W",

             "measurement": "level",

             "unit": "electric"},

         "humidity": {

             "entrytype": "subunitStatus",

             "dat": "45%",

             "measurement": "level",

             "unit": "hvac"},

         "upload": {

             "entrytype": "subunitStatus",

             "dat": "8 Mbit/s",

             "measurement": "level",

             "unit": "comms"

             }

         }


开满天机
浏览 124回答 3
3回答

汪汪一只猫

我找到了答案。代码没有任何问题。Web2Py 在字符串字段上设置默认长度。将 db.py 中的字段长度定义为较大的数字解决了该问题:db.define_table('packed_data',                 Field('unitid', 'string'),                 Field('uploaded', 'string'),                 Field('time_stamp', 'string'),                 Field('data_list', type='string', length=5000),                 redefine=True)

慕桂英4014372

控制器返回 的输出db[table_name].validate_and_insert(**vars)。.validate_and_insert首先运行为每个字段定义的验证器,然后仅在没有验证错误时才进行插入。如果没有插入记录,这意味着存在验证错误。请注意,这种情况下的验证错误不会自动导致异常或非 200 HTTP 响应。相反,控制器只是返回.validate_and_insert(转换为 JSON)的输出,其结构如下:{  id: [ID of inserted record if successful or null otherwise],  errors: {    'field1': 'error message 1',    'field2': 'error message 2',    ...  }}如果在出现验证错误时您不想要 200 响应,您可以将控制器代码更改为如下内容:    def POST(table_name,**vars):        result = db[table_name].validate_and_insert(**vars)        if result.errors:            raise HTTP(422, 'INVALID INPUT')        return result或者,您可以使用 200 响应返回结果,并让您的客户端代码检查返回的 JSON 以确定是否存在任何验证错误并采取相应措施。无论哪种情况,您都应该准备好在发生验证错误时处理它们。

蝴蝶不菲

在 models.py 中对于长数据,您可以尝试将字段类型设置为“文本”db.define_table('table_name',            Field('column_name', 'text')            )
随时随地看视频慕课网APP

相关分类

Python
我要回答