Web2Py发布失败

2024-09-28 22:23:46 发布

您现在位置:Python中文网/ 问答频道 /正文

Web2Py POST失败

将一些字典数据发布到Web2py。某些数据发布总是成功的,而某些数据发布总是失败的

此数据始终成功发布:

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"
             }
         }

客户端python代码:

import requests
from requests.auth import HTTPBasicAuth
from datetime import datetime
import json

auth=HTTPBasicAuth('LoginID', 'Password')
unitid = '19700111'
uploaded = 'no'
data = {
    'unitid': unitid,
    'uploaded': uploaded,
    'time_stamp': str(datetime.now()),
    'data_list': json.dumps(data),
    }

rq = requests.post(
"https://XXXXX.pythonanywhere.com/XXX/default/api/packed_data.json",
data=data,
auth=auth,
headers={'Connection':'close'}
)

以下是(标准)服务器端Web2py代码:

def api():  
    response.view = 'generic.'+request.extension
    def GET(*args,**vars):
        patterns = 'auto'
        parser = db.parse_as_rest(patterns,args,vars)
        if parser.status == 200:
            return dict(content=parser.response)
        else:
            raise HTTP(parser.status,parser.error)
    def POST(table_name,**vars):
        return db[table_name].validate_and_insert(**vars)
    def PUT(table_name,record_id,**vars):
        return db(db[table_name]._id==record_id).update(**vars)
    def DELETE(table_name,record_id):
        return db(db[table_name]._id==record_id).delete()
    return dict(GET=GET, POST=POST, PUT=PUT, DELETE=DELETE)

失败返回“Response 200”,但没有任何内容写入数据库


Tags: 数据nameiddbdatadeftableunit
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)

控制器返回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中,对于long long data,可以尝试将字段类型设置为“text”

db.define_table('table_name',
            Field('column_name', 'text')
            )

相关问题 更多 >