Problemas com POST (multiplos campos) em arquitetura ReST

29 views
Skip to first unread message

Carolina Nogueira

unread,
Mar 31, 2014, 11:04:21 AM3/31/14
to web2py-us...@googlegroups.com
Oi pessoal,

Estou iniciando um projeto utilizando ReST e estou com problemas para efetuar o POST passando mais do que um argumento por parâmetro. Ao efetuar o mesmo comando com curl, ele funciona normalmente, porém, ao utilizar uma função dentro da controller, me retorna um erro.

Meu modelo:
# table definition
db
.define_table('algorithm',
               
Field('name', 'string',length=255,unique=True),
               
Field('description', 'text'),
                format
='%(name)s')

Minha controller:
import requests
from requests.auth import HTTPBasicAuth

@request.restful()
def api():
    response
.view = 'generic.'+request.extension

   
def GET(*args,**vars):
        patterns
= 'auto'
        parser
= db.parse_as_rest(patterns,args,vars)
       
if parser.status == 200:
           
return dict(content=parser.response)
       
else:
           
raise HTTP(parser.status,parser.error)

   
def POST(table_name,**vars):
       
return db[table_name].validate_and_insert(**vars)

   
def PUT(table_name,record_id,**vars):
       
return db(db[table_name]._id==record_id).update(**vars)

   
def DELETE(table_name,record_id):
       
return db(db[table_name]._id==record_id).delete()
   
return dict(GET=GET, POST=POST, PUT=PUT, DELETE=DELETE)


def add_algorithm():
   
"""
    form to add new algorithms on database.
    """

    alg_form
=SQLFORM.factory(Field('name', requires=IS_NOT_IN_DB(db,db.algorithm.name)),
                             
Field('description'),
                             table_name
='algorithm')

   
if alg_form.accepts(request,session):
        payload
= {'name':alg_form.vars.name, 'description':alg_form.vars.description}
        r
= request.post("http://127.0.0.1:8000/webpricer/default/api/algorithm.json", data=payload, auth=('user', 'pass'))
        response
.flash = payload
   
elif alg_form.errors:
        response
.flash = T('Please check for errors on form!')
   
else:
        response
.flash = T('Please fill the form')
   
return dict(alg_form=alg_form)

O erro que me é retornado é o seguinte, referenciando a linha:

r = request.post("http://127.0.0.1:8000/webpricer/default/api/algorithm.json", data=payload, auth=('user', 'pass'))

<type 'exceptions.TypeError'>('NoneType' object is not callable)

 
Com os seguintes veriáveis:
global request  <Storage {'_vars': None, 'function': 'add_algori...ueira/Downloads/web2py/applications/webpricer/'}>
request.post  None
global data  <function data>
global auth  <gluon.tools.Auth object>
r  undefined
payload  {'description': 'Algorithm Description', 'name': 'Algorithm'}

Acredito que eu esteja com algum erro bobo no código, porque não faria sentido com curl funcionar o POST, mas não com o código python. Estou a alguns dias parada nesse erro e não achei nada semelhante nos fóruns e grupos de discussão.

Alguém pode me ajudar a ver o que não estou conseguindo ver?
Desde já agradeço!


Vinicius Assef

unread,
Mar 31, 2014, 1:32:07 PM3/31/14
to web2py-us...@googlegroups.com
2014-03-31 12:04 GMT-03:00 Carolina Nogueira <caro...@gmail.com>:
>
>
> O erro que me é retornado é o seguinte, referenciando a linha:
>
> r = request.post("http://127.0.0.1:8000/webpricer/default/api/algorithm.json", data=payload, auth=('user', 'pass'))
>
> <type 'exceptions.TypeError'>('NoneType' object is not callable)
>
>
> Com os seguintes veriáveis:
> global request <Storage {'_vars': None, 'function': 'add_algori...ueira/Downloads/web2py/applications/webpricer/'}>
> request.post None

Aqui está a resposta: request.post é None e você está tentando chamá-lo.

Um objeto None, que é do tipo NoneType, não é um callable.

cpnogueira

unread,
Mar 31, 2014, 2:50:01 PM3/31/14
to web2py-us...@googlegroups.com
Certo, mas porque no tutorial funcionaria e para mim está retornando "None"?

Diogo Munaro

unread,
Mar 31, 2014, 3:01:22 PM3/31/14
to web2py-us...@googlegroups.com
bobo mesmo ^^

requests.post(...)

request é do web2py, você importa requests


--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-br...@googlegroups.com
Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo quot;web2py-users-brazil" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-br...@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

cpnogueira

unread,
Mar 31, 2014, 5:53:59 PM3/31/14
to web2py-us...@googlegroups.com

Muuuuito obrigada!

Estava com o olhar "viciado" no código! Sabia que só poderia ser algo bobo =)

Valeu mesmo!


Em segunda-feira, 31 de março de 2014 21h01min22s UTC+2, Diogo escreveu:
bobo mesmo ^^

requests.post(...)

request é do web2py, você importa requests
Em 31 de março de 2014 15:50, cpnogueira <caro...@gmail.com> escreveu:
Certo, mas porque no tutorial funcionaria e para mim está retornando "None"?

Em segunda-feira, 31 de março de 2014 19h32min07s UTC+2, viniciusban escreveu:
2014-03-31 12:04 GMT-03:00 Carolina Nogueira <caro...@gmail.com>:
>
>
> O erro que me é retornado é o seguinte, referenciando a linha:
>
> r = request.post("http://127.0.0.1:8000/webpricer/default/api/algorithm.json", data=payload, auth=('user', 'pass'))
>
> <type 'exceptions.TypeError'>('NoneType' object is not callable)
>
>
> Com os seguintes veriáveis:
> global request  <Storage {'_vars': None, 'function': 'add_algori...ueira/Downloads/web2py/applications/webpricer/'}>
> request.post  None

Aqui está a resposta: request.post é None e você está tentando chamá-lo.

Um objeto None, que é do tipo NoneType, não é um callable.

--
Você recebeu essa mensagem por estar inscrito no grupo web2py-users-brazil.
Para enviar uma mensagem ao grupo, envie email a: web2py-us...@googlegroups.com
Para se desinscrever, envie email a: web2py-users-brazil+unsub...@googlegroups.com

Para mais opções, visite o site do grupo em: http://groups.google.com/group/web2py-users-brazil?hl=en
---
Você recebeu essa mensagem porque está inscrito no grupo quot;web2py-users-brazil" dos Grupos do Google.

Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para web2py-users-brazil+unsub...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages