python - 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"
}
}
客户端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)
失败返回“响应 200”,但没有任何内容写入数据库。
解决方案
控制器返回 的输出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 以确定是否存在任何验证错误并采取相应措施。
无论哪种情况,您都应该准备好在发生验证错误时处理它们。
推荐阅读
- iis - phpmyadmin sql 选项卡无法正常工作
- gitlab - Is there a way to upload GitLab CI artifacts to an Openshift container?
- build - Visual Studio Code 中的 Visual Studio 配置管理器的等价物是什么?
- bash - 如何从文件中获取第 n 行并将结果保存到变量中
- ssh - SSH - 用标题分隔 grep 结果
- java - 将批处理数据存储在 NoSQL 数据库中,而不是 WildFly 上 Jberet 中的文件系统中
- javascript - 将两个整数数组添加到数组数组中,以便创建坐标对
- javascript - Jest 无法解析带有 @ (at) 字符的导入
- algorithm - 计算三角函数、对数或类似的算法。只有加减法
- python - 在一系列列表中重新分配字符串值