# Tornado Tryton connection Module

**URL:** <https://discuss.tryton.org/t/tornado-tryton-connection-module/4256>\
**Category:** Third Party Modules\
**Created:** [May 27, 2021, 8:25pm UTC](https://discuss.tryton.org/t/tornado-tryton-connection-module/4256 "2021-05-27T20:25:43Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![banknote](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/banknote/32/980_2.png) [@banknote](https://discuss.tryton.org/u/banknote)\
**Post date:** [May 27, 2021, 8:25pm UTC](https://discuss.tryton.org/t/tornado-tryton-connection-module/4256/1 "2021-05-27T20:25:43Z")

</div>

# tornado-tryton

- ✍ Tin
- 🏘 [https://newtryton.com/](https://newtryton.com/)
- 📦 [Client Challenge](https://pypi.org/project/tornado-tryton/)
- 🐛 [GitHub · Where software is built](https://github.com/TinKurbatoff/tornado-tryton/issues)
- 🦎 5.0+
- 🐍 3.6+

 ![image](https://discuss-cdn.tryton.org/uploads/default/original/2X/6/6dc8bceef1443fdabecba79e884d9971cde6ae63.png)

This is a simple-to-use connector to implement Tryton-based models in the Tornado web app. The realization is based on the [flask-tryton module](https://discuss.tryton.org/t/flask-tryton-module/737). Tornado — is a non-blocking I/O framework that is the most suitable for high-performance back-end applications.  
Some [discussion on Hackernoon](https://hackernoon.com/django-too-big-flask-too-small-tornado-just-right-d5d002586bbc) about it.  
Tornado is a well-suited powerful framework to build a lightweight Tryton-based backend. It is easy to deploy and debug.  
Here you may find the module:

> **[Client Challenge](https://pypi.org/project/tornado-tryton/)**

Currently, it is under active development.

**Install:**  
`pip install tornado-tryton`

**Use:**  
It is **not** recommended to use URL variables for password transmission as it may be recorded in server log files, and it is advised to move auth data into a _request headers_ section. In the example, a simpler approach was used for simplicity, though.

```auto
#!python3
from tornado_tryton import Tryton # class to connect to Tryton DB

import json

## Tornado webserver modules
from tornado.web import RequestHandler
from tornado.gen import coroutine # used for async execution in earlier version of Python 
from tornado.options import define, options # to access to a server-wide configuration 

TRYTON_CONFIG = '/etc/trytond.conf' # Check Tryton's doc for Tryton configuration details, access to Tryton DB is configured here 

############## TRYTON INTEGRATION #################
define('config', default={"TRYTON_DATABASE" : "tryton", "TRYTON_CONFIG" : TRYTON_CONFIG}, help='app config path')
tryton = Tryton(options)
User = tryton.pool.get('res.user') # Important class type - User

@tryton.default_context # To create a default context of Tryton transactions
def default_context():
    return User.get_preferences(context_only=True)
## —————————————————————————————————————————————————————————

########### RESPONDER FOR API REQUEST, HTML requests are handled in the same way.
class TrytonUser(RequestHandler):
    """Request for log in to Tryton"""
    SUPPORTED_METHODS = ("GET", "POST",)

    def jsonify(self, data, status=200):
        header = "Content-Type"
        body = "application/json"
        self.set_header(header, body)
        self.set_status(status)
        self.write(json.dumps(data))

    @tryton.transaction() ## To initiate tryton transaction and pass "local" request details 
    async def post(self, login, password):            

        # Check login and authorize
        user = User.search([('login', 'ilike', login)]) # Use `ilike` to ignore char case in login             
        if len(user)>0:
            # So, login is exist
            user, = User.search([('login', 'ilike', login)]) # to get the the first from the list if many
            parameters = {}
            parameters['password'] = password
            user_id = User.get_login(user.login, parameters) # bicrypt hash function
            if user_id:
                ## If user_id found — everyting is correct
                return self.jsonify(data={"result" : "success"}, status = 200)
            else:
                ## If none found — password is incorrect
                return self.jsonify({"result" : "wrong password"}, status=401)
        else:
            return self.jsonify({"result" : "unknown user"}, status=401)

```

```auto

```

---

<div class="post-metadata">

**Author:** ![oscar](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/oscar/32/1919_2.png) [@oscar](https://discuss.tryton.org/u/oscar)\
**Post date:** [June 6, 2021, 4:25pm UTC](https://discuss.tryton.org/t/tornado-tryton-connection-module/4256/2 "2021-06-06T16:25:12Z")

</div>

Congrats, I am thinking to use FastApi for do the same, a new tryton connector.  
[Fastapi](https://fastapi.tiangolo.com/)

---

<div class="post-metadata">

**Author:** ![banknote](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/banknote/32/980_2.png) [@banknote](https://discuss.tryton.org/u/banknote)\
**Post date:** [June 8, 2021, 10:35pm UTC](https://discuss.tryton.org/t/tornado-tryton-connection-module/4256/3 "2021-06-08T22:35:22Z")

</div>

Good!  
Note: Tornado is a web-app framework that is very similar to Django and allows one to build a complex template-based web interface over API if you need that, but without its complexity.  
Fast-API is amazing in creating JSON-based API backend in minutes. Like it, as well!  
I chose Tornado because it is a non-blocking server, very simple and very fast, well-documented, and it even doesn’t require a Gunicorn atop.

---

<div class="post-metadata">

**Author:** ![numaelis](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/n/9de053/32.png) [@numaelis](https://discuss.tryton.org/u/numaelis)\
**Post date:** [September 4, 2025, 1:20am UTC](https://discuss.tryton.org/t/tornado-tryton-connection-module/4256/4 "2025-09-04T01:20:41Z")

</div>

Hola Chicos!

para sumar he subido un conector para falcon: [falcon-tryton](https://gitlab.com/numaelis/falcon-tryton)

realicé un test simple con los conectores de [tornado](https://github.com/TinKurbatoff/tornado-tryton), [fastapi async](https://github.com/TinKurbatoff/fastapi-tryton-async), flask y falcon.

las 3 primeras mostraron casi que el mismo rendimiento, son muy rápidas!

falcon con tryton mostró un 10-15% mas rápido.
