2011-11-04 65 views
0

我想知道如何通过服务调用使用SQLFORM更新数据库使用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变量作为数据= { “名称” 发送: “XYZ”, “电子邮件”:“XYZ @ gmail.com“}

我想知道我是否正确sendign后的变量。我总是得到失败的消息。为什么数据库没有得到更新。请给我一些指导。其实我想用form = auth.register()来做到这一点。我需要通过服务调用输入auth表值。但这是很长的路要走。

在此先感谢


安东尼,

这是我张贴的方式。

url = "http://mydomain.com/myapp/mycontroller/api/person" 
data = {"name":"peter","email":"[email protected]"} 
datatosend = urllib.urlencode(data) 
request = urllib2.Request(url,datatosend) 
res = urllib2.urlopen(req) 

但是api中的POST方法根本看不到这个人。请帮帮我。我迫切需要。

回答

0

当您创建通过SQLFORM一种形式,一种特殊的隐藏_formname字段添加到窗体。如果发布的数据不包括配套_formname领域,form.accepts()方法将失败。代替默认的表格名称,你可以指定自己的,并把它添加到发布的数据:

@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

+0

感谢安东尼,但你能解释一下我为什么我的功能如问题所示没有达到预期效果。 – athinker

+0

安东尼,我试图RESTful Web服务,但它没有采取请求。它不是在所有的表名中标识。我正在使用urllib2进行POST。 – athinker

+0

查看上面更新的答案。 @ request.restful版本适用于我 - 也许你的POST请求有问题。 – Anthony