Как обновить базу данных с помощью sqlform через сервисный вызов - PullRequest
0 голосов
/ 05 ноября 2011

Я хотел знать, как обновить базу данных с помощью 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 (). Мне нужно ввести значения таблицы аутентификации через сервисный вызов. но это долгий путь.

Заранее спасибо


Энтони,

Так я и публикуюсь.

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)

но метод POST в api вообще не видит человека. Пожалуйста, помогите мне. Я остро нуждаюсь.

1 Ответ

0 голосов
/ 05 ноября 2011

Когда вы создаете форму с помощью 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)

В противном случае будет возвращен вставленный идентификатор записи в случае успешной ошибки или ошибки проверки.

Альтернативой @service.run является новая RESTful веб-служба функциональность:

@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

...