2011-11-04 1 views
0

Je voulais savoir comment mettre à jour la base de données à l'aide de sqlform via un appel de service. par exempleComment mettre à jour la base de données à l'aide de sqlform via un appel de service

db.py contient

db.define_table('person', 
Field('name'), 
Field('email')) 
contrôleur

contient

@service.run 
def display_form(): 
form = SQLFORM(db.person) 
if form.accepts(request.vars): 
    return "success" 
else: 
    return "failure" 

La variable post http est envoyé en tant que données = { "name": "xyz", "email": "xyz @ gmail.com "}

Je voudrais savoir si je suis sendign les variables de poste correctement. Je reçois toujours le message d'échec. Pourquoi la base de données ne se met-elle pas à jour? S'il vous plaît donnez-moi quelques conseils. En fait je voudrais le faire avec form = auth.register(). J'ai besoin d'entrer les valeurs de la table auth via un appel de service. mais c'est long chemin à parcourir.

Merci à l'avance


Anthony,

Ceci est la façon dont je suis l'affichage.

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) 

mais la méthode POST dans API ne voit pas la personne du tout. Aidez-moi, s'il vous plaît. J'ai un besoin urgent.

Répondre

0

Lorsque vous créez un formulaire via SQLFORM, un champ spécial _formname masqué est ajouté au formulaire. Si les données publiées n'incluent pas de champ _formname correspondant, la méthode form.accepts() échouera. A la place de la formname par défaut, vous pouvez spécifier votre propre, et l'ajouter aux données affichées:

@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' 

Cependant, une méthode beaucoup plus simple est d'éviter la forme tout à fait et insérer directement le dossier (en tirant parti de le processus de validation en utilisant la méthode validate_and_insert):

@service.run 
def display_form(): 
    return db.person.validate_and_insert(**request.vars) 

Cela renverra l'ID d'enregistrement inséré en cas d'erreur ou de validation avec succès autrement.

Une alternative à @service.run est la nouvelle fonctionnalité 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() 

Insérez ensuite un enregistrement via une requête POST à:

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

+0

grâce anthony, mais pourriez-vous s'il vous plaît me expliquer pourquoi mon fonctions comme indiqué dans les questions ne font pas le prévu. – athinker

+0

anthony, j'ai essayé webservice reposant mais il ne prend pas la demande. Il n'identifie pas le nom de table atall. J'utilise urllib2 pour POST. – athinker

+0

Voir la réponse mise à jour ci-dessus. La version @ request.restful fonctionne pour moi - il y a peut-être un problème avec votre requête POST. – Anthony

Questions connexes