为了账号安全,请及时绑定邮箱和手机立即绑定

Web2Py POST 失败

Web2Py POST 失败

开满天机 2022-06-02 17:24:37
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"             }         }
查看完整描述

3 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

我找到了答案。代码没有任何问题。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)


查看完整回答
反对 回复 2022-06-02
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

控制器返回 的输出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 以确定是否存在任何验证错误并采取相应措施。


无论哪种情况,您都应该准备好在发生验证错误时处理它们。


查看完整回答
反对 回复 2022-06-02
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

在 models.py 中对于长数据,您可以尝试将字段类型设置为“文本”


db.define_table('table_name',

            Field('column_name', 'text')

            )


查看完整回答
反对 回复 2022-06-02
  • 3 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信