我想知道如何通过服务调用使用sqlform更新数据库。例如
db.py包含
db.define_table('person',
Field('name'),
Field('email'))
控制器包含
@service.run
def display_form():
form = SQLFORM(db.person)
if form.accepts(request.vars):
return "success"
else:
return "failure"
http post变量以data = {“name”:“xyz”,“email”:“xyz@gmail.com”}
发送我想知道我是否正确发送了帖子变量。我总是收到失败的消息。为什么数据库没有得到更新。请给我一些指导。其实我想用form = auth.register()来做这件事。我需要通过服务调用输入auth表值。但这还有很长的路要走。
提前致谢
安东尼,
这是我发布的方式。
url = "http://mydomain.com/myapp/mycontroller/api/person"
data = {"name":"peter","email":"peter@gmail.com"}
datatosend = urllib.urlencode(data)
request = urllib2.Request(url,datatosend)
res = urllib2.urlopen(req)
但api中的POST方法根本没有看到这个人。请帮我。我迫切需要。
答案 0 :(得分:0)
当您通过SQLFORM
创建表单时,会向表单添加一个特殊的隐藏_formname
字段。如果发布的数据不包含匹配的_formname
字段,则form.accepts()
方法将失败。代替默认的formname,您可以指定自己的,并将其添加到发布的数据中:
@service.run
def display_form():
request.vars._formname = 'myform'
form = SQLFORM(db.person)
if form.accepts(request.vars, formname='myform'):
return 'success'
else:
return 'failure'
然而,一个更简单的方法是完全避免表单并直接插入记录(仍然使用validate_and_insert
方法利用验证过程):
@service.run
def display_form():
return db.person.validate_and_insert(**request.vars)
如果成功则返回插入的记录ID,否则返回验证错误。
@service.run
的替代方案是新的RESTful web services功能:
@request.restful()
def api():
def POST(tablename, **fields):
if not tablename == 'person': raise HTTP(400)
return db.person.validate_and_insert(**fields)
return locals()
然后通过POST请求将记录插入: