Discussion:
[tryton-es] Enviar datos desde flask_tryton
Josias Pérez
2018-01-15 21:11:45 UTC
Permalink
Hola amigos,

Estoy trabajando en una app desde flask para enviar datos a tryton como
backend.

Tengo el siguiente código:

from flask import render_template, flash, redirect, url_for
from app import app
from app import tryton

User = tryton.pool.get('res.user')
Party = tryton.pool.get('party.party')

@tryton.default_context
def default_context():
return User.get_preferences(context_only=True)

@app.route('/admin')
@tryton.transaction()
def hello():
user, = User.search([('login', '=', 'admin')])
return '%s, Hello World!' % user.name

@app.route('/add')
@tryton.transaction()
def add():
party1, = Party.create([{
'name': 'Party 1',
}])
return "Done"
#InternalError: cannot execute nextval() in a read-only transaction

La ruta de /admin funciona bien, y devuelve el valor esperado, pero el ruta
de add me devuelve InternalError: cannot execute nextval() in a read-only
transaction.

¿Cuál sería la forma correcta de enviar datos a tryton desde una aplicación
externa en flask?

Gracias desde ya
Raimon Esteve
2018-01-15 23:03:07 UTC
Permalink
Post by Josias Pérez
Hola amigos,
Estoy trabajando en una app desde flask para enviar datos a tryton como
backend.
from flask import render_template, flash, redirect, url_for
from app import app
from app import tryton
User = tryton.pool.get('res.user')
Party = tryton.pool.get('party.party')
@tryton.default_context
return User.get_preferences(context_only=True)
@app.route('/admin')
@tryton.transaction()
user, = User.search([('login', '=', 'admin')])
return '%s, Hello World!' % user.name
@app.route('/add')
@tryton.transaction()
party1, = Party.create([{
'name': 'Party 1',
}])
return "Done"
#InternalError: cannot execute nextval() in a read-only transaction
La ruta de /admin funciona bien, y devuelve el valor esperado, pero el
ruta de add me devuelve InternalError: cannot execute nextval() in a
read-only transaction.
¿Cuál sería la forma correcta de enviar datos a tryton desde una
aplicación externa en flask?
si usas el GET, la transación es sólo lectura.
si deseas agregar datos, debes hacer un POST o PUT.

http://flask.pocoo.org/docs/0.12/quickstart/
Post by Josias Pérez
Gracias desde ya
Josias Pérez
2018-01-16 00:51:50 UTC
Permalink
Le he agregado la siguiente línea a la ruta
@app.route('/add', methods=['GET', 'POST','PUT'])

Pero sigue desplegando la siguiente salida en el log

uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 263, in execute
uwsgi[7071]: self._pq_execute(self._query, conn._async)
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 696, in _pq_execute
uwsgi[7071]: self._pq_fetch()
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 757, in _pq_fetch
uwsgi[7071]: raise self._conn._create_exception(cursor=self)
uwsgi[7071]: InternalError: cannot execute nextval() in a read-only
transaction

Creo que es un problema con permisos dentro de tryton, pero no sé como
otorgarle los mismos.
Post by Raimon Esteve
Post by Josias Pérez
Hola amigos,
Estoy trabajando en una app desde flask para enviar datos a tryton como
backend.
from flask import render_template, flash, redirect, url_for
from app import app
from app import tryton
User = tryton.pool.get('res.user')
Party = tryton.pool.get('party.party')
@tryton.default_context
return User.get_preferences(context_only=True)
@app.route('/admin')
@tryton.transaction()
user, = User.search([('login', '=', 'admin')])
return '%s, Hello World!' % user.name
@app.route('/add')
@tryton.transaction()
party1, = Party.create([{
'name': 'Party 1',
}])
return "Done"
#InternalError: cannot execute nextval() in a read-only transaction
La ruta de /admin funciona bien, y devuelve el valor esperado, pero el
ruta de add me devuelve InternalError: cannot execute nextval() in a
read-only transaction.
¿Cuál sería la forma correcta de enviar datos a tryton desde una
aplicación externa en flask?
si usas el GET, la transación es sólo lectura.
si deseas agregar datos, debes hacer un POST o PUT.
http://flask.pocoo.org/docs/0.12/quickstart/
Post by Josias Pérez
Gracias desde ya
Raimon Esteve
2018-01-16 06:11:57 UTC
Permalink
El dia 16 gen. 2018 1:51 a. m., "Josias Pérez" <***@gmail.com> va
escriure:

Le he agregado la siguiente línea a la ruta
@app.route('/add', methods=['GET', 'POST','PUT'])

Pero sigue desplegando la siguiente salida en el log

uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 263, in execute
uwsgi[7071]: self._pq_execute(self._query, conn._async)
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 696, in _pq_execute
uwsgi[7071]: self._pq_fetch()
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 757, in _pq_fetch
uwsgi[7071]: raise self._conn._create_exception(cursor=self)
uwsgi[7071]: InternalError: cannot execute nextval() in a read-only
transaction


La llamada la realitzas mediatea get, no post o put. Usa un formulario por
ejemplo.


Creo que es un problema con permisos dentro de tryton, pero no sé como
otorgarle los mismos.
Post by Raimon Esteve
Post by Josias Pérez
Hola amigos,
Estoy trabajando en una app desde flask para enviar datos a tryton como
backend.
from flask import render_template, flash, redirect, url_for
from app import app
from app import tryton
User = tryton.pool.get('res.user')
Party = tryton.pool.get('party.party')
@tryton.default_context
return User.get_preferences(context_only=True)
@app.route('/admin')
@tryton.transaction()
user, = User.search([('login', '=', 'admin')])
return '%s, Hello World!' % user.name
@app.route('/add')
@tryton.transaction()
party1, = Party.create([{
'name': 'Party 1',
}])
return "Done"
#InternalError: cannot execute nextval() in a read-only transaction
La ruta de /admin funciona bien, y devuelve el valor esperado, pero el
ruta de add me devuelve InternalError: cannot execute nextval() in a
read-only transaction.
¿Cuál sería la forma correcta de enviar datos a tryton desde una
aplicación externa en flask?
si usas el GET, la transación es sólo lectura.
si deseas agregar datos, debes hacer un POST o PUT.
http://flask.pocoo.org/docs/0.12/quickstart/
Post by Josias Pérez
Gracias desde ya
Sergi Almacellas Abellana
2018-01-16 08:28:24 UTC
Permalink
Le he agregado la siguiente línea a la ruta 
@app.route('/add', methods=['GET', 'POST','PUT'])
Pero sigue desplegando la siguiente salida en el log 
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 263, in execute
uwsgi[7071]: self._pq_execute(self._query, conn._async)
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 696, in _pq_execute
uwsgi[7071]: self._pq_fetch()
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 757, in _pq_fetch
uwsgi[7071]: raise self._conn._create_exception(cursor=self)
uwsgi[7071]: InternalError: cannot execute nextval() in a read-only
transaction
La llamada la realitzas mediatea get, no post o put. Usa un formulario
por ejemplo. 
De hecho no es necessario hacer un post o un put. El problema biene dado
por que la transacción es de solo lectura, lo puedes modificar con el
primer parametro del decorador transaction:

http://hg.b2ck.com/flask-tryton/file/4477c66f0965/flask_tryton.py#l69

Por ejemplo usando:

@tryton.transaction(readonly=False)

Un saludo,
--
Sergi Almacellas Abellana
www.koolpi.com
Twitter: @pokoli_srk
Josias Pérez
2018-01-16 14:41:17 UTC
Permalink
Con esto ha funcionado muy bien, gracias. No es necesario usar POST ni GET
excepto si utilizo formularios. Gracias desde ya.

El martes, 16 de enero de 2018, 2:28:27 (UTC-6), Sergi Almacellas Abellana
<javascript:>
Post by Josias Pérez
Le he agregado la siguiente línea a la ruta
@app.route('/add', methods=['GET', 'POST','PUT'])
Pero sigue desplegando la siguiente salida en el log
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
Post by Josias Pérez
line 263, in execute
uwsgi[7071]: self._pq_execute(self._query, conn._async)
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
Post by Josias Pérez
line 696, in _pq_execute
uwsgi[7071]: self._pq_fetch()
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
Post by Josias Pérez
line 757, in _pq_fetch
uwsgi[7071]: raise self._conn._create_exception(cursor=self)
uwsgi[7071]: InternalError: cannot execute nextval() in a read-only
transaction
La llamada la realitzas mediatea get, no post o put. Usa un formulario
por ejemplo.
De hecho no es necessario hacer un post o un put. El problema biene dado
por que la transacción es de solo lectura, lo puedes modificar con el
http://hg.b2ck.com/flask-tryton/file/4477c66f0965/flask_tryton.py#l69
@tryton.transaction(readonly=False)
Un saludo,
--
Sergi Almacellas Abellana
www.koolpi.com
Raimon Esteve
2018-01-16 21:56:50 UTC
Permalink
hola,
Post by Josias Pérez
Con esto ha funcionado muy bien, gracias. No es necesario usar POST ni GET
excepto si utilizo formularios. Gracias desde ya.
Ten en cuenta en un sistema de producción puede ser una inyección de datos
masivos si no lo controlas permitiendo escritura via GET.

Atentamente,
Josias Pérez
2018-01-19 14:59:05 UTC
Permalink
Estoy trabajando con FlaskForm

@app.route('/enviar', methods=['GET', 'POST'])
@tryton.transaction(readonly=False)
def index():
form = LoginForm()
firstname = form.firstname.data
email = form.email.data
phone = form.phone.data
city = form.city.data
if form.validate_on_submit():
party1, = Party.create([{
'name': firstname,
}])
ContactMechanism.create([{
'party': party1.id,
'type': 'email',
'value': email,
}])[0]
ContactMechanism.create([{
'party': party1.id,
'type': 'phone',
'value': phone,
}])[0]
Address.create([{
'party': party1.id,
'city': city,
}])

return redirect('/bienvenido')
return render_template('enviar.html', form=form)

¿Podrías ayudar con alguna recomendación para proteger el envío masivo de
datos?
Post by Raimon Esteve
hola,
Post by Josias Pérez
Con esto ha funcionado muy bien, gracias. No es necesario usar POST ni
GET excepto si utilizo formularios. Gracias desde ya.
Ten en cuenta en un sistema de producción puede ser una inyección de datos
masivos si no lo controlas permitiendo escritura via GET.
Atentamente,
Gonzalo González Domínguez
2018-01-16 08:29:27 UTC
Permalink
No me he metido todavía con flask-trytond, pero la librería requests es uno
de los mejores amigos que se pueden tener para hacer peticiones http
siempre:

http://docs.python-requests.org/en/master/user/quickstart/#make-a-request

No se su flask-trytond tiene ya métodos implementados, sino con esta lib
pueds hacer cualquier petición, manejar cabeceras, gestionar params, etc
Post by Josias Pérez
Le he agregado la siguiente línea a la ruta
@app.route('/add', methods=['GET', 'POST','PUT'])
Pero sigue desplegando la siguiente salida en el log
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 263, in execute
uwsgi[7071]: self._pq_execute(self._query, conn._async)
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 696, in _pq_execute
uwsgi[7071]: self._pq_fetch()
uwsgi[7071]: File
"/opt/cr/local/lib/python2.7/site-packages/psycopg2cffi/_impl/cursor.py",
line 757, in _pq_fetch
uwsgi[7071]: raise self._conn._create_exception(cursor=self)
uwsgi[7071]: InternalError: cannot execute nextval() in a read-only
transaction
La llamada la realitzas mediatea get, no post o put. Usa un formulario por
ejemplo.
Creo que es un problema con permisos dentro de tryton, pero no sé como
otorgarle los mismos.
Post by Raimon Esteve
Post by Josias Pérez
Hola amigos,
Estoy trabajando en una app desde flask para enviar datos a tryton como
backend.
from flask import render_template, flash, redirect, url_for
from app import app
from app import tryton
User = tryton.pool.get('res.user')
Party = tryton.pool.get('party.party')
@tryton.default_context
return User.get_preferences(context_only=True)
@app.route('/admin')
@tryton.transaction()
user, = User.search([('login', '=', 'admin')])
return '%s, Hello World!' % user.name
@app.route('/add')
@tryton.transaction()
party1, = Party.create([{
'name': 'Party 1',
}])
return "Done"
#InternalError: cannot execute nextval() in a read-only transaction
La ruta de /admin funciona bien, y devuelve el valor esperado, pero el
ruta de add me devuelve InternalError: cannot execute nextval() in a
read-only transaction.
¿Cuál sería la forma correcta de enviar datos a tryton desde una
aplicación externa en flask?
si usas el GET, la transación es sólo lectura.
si deseas agregar datos, debes hacer un POST o PUT.
http://flask.pocoo.org/docs/0.12/quickstart/
Post by Josias Pérez
Gracias desde ya
Loading...