如何通过服务调用使用sqlform更新数据库

时间:2011-11-04 22:16:43

标签: web2py

我想知道如何通过服务调用使用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方法根本没有看到这个人。请帮我。我迫切需要。

1 个答案:

答案 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请求将记录插入:

http://mydomain.com/myapp/mycontroller/api/person