2011-11-04 63 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