# Tryton flask - user login

**URL:** <https://discuss.tryton.org/t/tryton-flask-user-login/1122>\
**Category:** Developer\
**Tags:** flask\
**Created:** [February 7, 2019, 4:14pm UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122 "2019-02-07T16:14:49Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![bala4901](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/b/fbc32d/32.png) [@bala4901](https://discuss.tryton.org/u/bala4901)\
**Post date:** [February 7, 2019, 4:14pm UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/1 "2019-02-07T16:14:49Z")

</div>

hi,

i am creating a web for warehouse handy terminal. how to implement login using tryton user?

currently there is a setting TRYTON\_USER, so any edit, update delete happen to only one user.  
so it cause audit trail.

my solution as below:  
User = tryton.pool.get(‘res.user’)  
parameters = {}  
parameters[‘password’] = ‘userpwd’  
user\_id = User.get\_login(‘user1’, parameters)  
 → using user\_id to overwrite create\_uid, update\_uid whenever add & update.

may i know, there is more clean solution?

---

<div class="post-metadata">

**Author:** ![nicoe](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/nicoe/32/2880_2.png) [@nicoe](https://discuss.tryton.org/u/nicoe)\
**Post date:** [February 7, 2019, 4:35pm UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/2 "2019-02-07T16:35:54Z")

</div>

tryton-flask defines an `transaction` decorator which has a `user` parameter that can be a user ID or a callable. This callable could use some information from the `request` to compute the user that initiated it.

---

<div class="post-metadata">

**Author:** ![bala4901](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/b/fbc32d/32.png) [@bala4901](https://discuss.tryton.org/u/bala4901)\
**Post date:** [February 7, 2019, 4:44pm UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/3 "2019-02-07T16:44:12Z")

</div>

may i know how to put the user parameter to transaction decrator during runtime?

example; in flask config TRYTON\_USER=0 aka root. then I log in uding user1 with id =2.  
how am I put id=2 to the decorator?  
@tryton.transaction(user=2) → how to set in runtime?

---

<div class="post-metadata">

**Author:** ![nicoe](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/nicoe/32/2880_2.png) [@nicoe](https://discuss.tryton.org/u/nicoe)\
**Post date:** [February 7, 2019, 4:55pm UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/4 "2019-02-07T16:55:03Z")

</div>

As I said: the `transaction` decorator accept a callable for the `user` parameter.  
So something like:

```python

def always_two():
     return 2

@tryton.transaction(user=always_two)
def foo():
    …

```

The tricky part is the function, you could use some session management in flask, or use tryton to do it, I don’t know.

---

<div class="post-metadata">

**Author:** ![ced](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/ced/32/1237_2.png) [@ced](https://discuss.tryton.org/u/ced)\
**Post date:** [February 7, 2019, 5:05pm UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/5 "2019-02-07T17:05:19Z")

</div>

But flask-tryton is not really the best option to interact with Tryton’s user. It was design with in mind the `web_user` module.  
If you want to make a workflow tailored application, it is probably better to use [User Application — Tryton server](http://docs.tryton.org/projects/server/en/latest/topics/user_application.html)

---

<div class="post-metadata">

**Author:** ![bala4901](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/b/fbc32d/32.png) [@bala4901](https://discuss.tryton.org/u/bala4901)\
**Post date:** [February 7, 2019, 5:08pm UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/6 "2019-02-07T17:08:51Z")

</div>

i was consider using user application. however, curent project is using rf terminal in warehouse.

so, it is not dedicated user per one handy terminal.  
that why, i need to implement login function.

---

<div class="post-metadata">

**Author:** ![bala4901](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/b/fbc32d/32.png) [@bala4901](https://discuss.tryton.org/u/bala4901)\
**Post date:** [February 7, 2019, 5:10pm UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/7 "2019-02-07T17:10:34Z")

</div>

oh i see.. it can use function as parameter.  
i will try it.. thank

---

<div class="post-metadata">

**Author:** ![bala4901](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/b/fbc32d/32.png) [@bala4901](https://discuss.tryton.org/u/bala4901)\
**Post date:** [February 8, 2019, 4:12am UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/8 "2019-02-08T04:12:35Z")

</div>

Just some update, I have some work around. So to post for help:  
Session management which I am using flask-login.  
Write the tryton.transaction inside a function.

```
from flask_login import current_user, login_required

@bp.route('/', methods=['GET', 'POST'])
@bp.route('/index', methods=['GET', 'POST'])
@login_required
def write():
    @tryton.transaction(user=current_user.get_id(), readonly=False)
    def write_action():
        Party = tryton.pool.get('party.party')

        party, = Party.search([('id', '=', 2)])
        Party.write([party], {'name': 'I am a supplier '})

        return user
    return write_action()

```

---

<div class="post-metadata">

**Author:** ![ced](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/ced/32/1237_2.png) [@ced](https://discuss.tryton.org/u/ced)\
**Post date:** [February 8, 2019, 8:08am UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/9 "2019-02-08T08:08:13Z")

</div>

I’m pretty sure you can write:

```auto
from flask_login import current_user, login_required

@bp.route('/', methods=['GET', 'POST'])
@bp.route('/index', methods=['GET', 'POST'])
@login_required
@tryton.transaction(user=current_user.get_id)
def write():
    Party = tryton.pool.get('party.party')
    party, = Party.search([('id', '=', 2)])
    if request.method == 'POST':
        Party.write([party], {'name': 'I am a supplier '})

```

---

<div class="post-metadata">

**Author:** ![bala4901](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/b/fbc32d/32.png) [@bala4901](https://discuss.tryton.org/u/bala4901)\
**Post date:** [February 8, 2019, 8:57am UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/10 "2019-02-08T08:57:45Z")

</div>

Hi @ced,

Eh.. Later I try again and let you know the result

Last night, I had tried. But the “current\_user” value was still None.

best regards

---

<div class="post-metadata">

**Author:** ![ced](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/ced/32/1237_2.png) [@ced](https://discuss.tryton.org/u/ced)\
**Post date:** [February 8, 2019, 9:11am UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/11 "2019-02-08T09:11:28Z")

</div>

> [@bala4901](#):
>
> Last night, I had tried. But the “current\_user” value was still None.

Notice that it is the `get_id` function that is passed and not the call result.

---

<div class="post-metadata">

**Author:** ![bala4901](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/b/fbc32d/32.png) [@bala4901](https://discuss.tryton.org/u/bala4901)\
**Post date:** [February 10, 2019, 4:46pm UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/12 "2019-02-10T16:46:50Z")

</div>

Hi @ced,  
Sorry for reply you late, the solution propose is not working. Because the current\_user still in nonetype.

In the end, I used “g” app context for to this purpose.

```
from flask import g
from flask_login import current_user, login_required
from app.inventory import bp

def get_id():
     if 'uid' not in g:
         g.uid = current_user.get_id()
     return g.uid
	 
@bp.route('/lot_register/<record("stock.move"):move>', methods=['GET', 'POST'])
@login_required
@tryton.transaction(user=get_id)
def lot_register(move):
    title = _('Create Lot')
    back_url = g.back_url
    ....

```

---

<div class="post-metadata">

**Author:** ![ced](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/ced/32/1237_2.png) [@ced](https://discuss.tryton.org/u/ced)\
**Post date:** [February 10, 2019, 7:31pm UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/13 "2019-02-10T19:31:21Z")

</div>

Indeed current\_user is a LocalProxy to \_get\_user method. So it is not possible to have a reference to the get\_id method. I guess this could work:

```
@tryton.transaction(user=lambda current_user.get_id())

```

---

<div class="post-metadata">

**Author:** ![bala4901](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/b/fbc32d/32.png) [@bala4901](https://discuss.tryton.org/u/bala4901)\
**Post date:** [February 11, 2019, 1:22am UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/14 "2019-02-11T01:22:05Z")

</div>

Hi @ced,

thank, it is worked and it clearer than my solution.

Just to correction for the syntax:  
`@tryton.transaction(user=lambda:current_user.get_id())`

---

<div class="post-metadata">

**Author:** ![andres53016](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/andres53016/32/406_2.png) [@andres53016](https://discuss.tryton.org/u/andres53016)\
**Post date:** [November 25, 2021, 2:46pm UTC](https://discuss.tryton.org/t/tryton-flask-user-login/1122/15 "2021-11-25T14:46:28Z")

</div>

Hi @bala4901, how did you resolve to return NoneType for current\_user. I have the following code:

```auto
tryton = Tryton(app, configure_jinja=True)
UserT = tryton.pool.get('res.user')                                          

class User(UserMixin):
    def __init__ (self, id):
        self.id = id
        self.username = UserT(id).login
        self.name = UserT(id).name
@login_manager.user_loader
def load_user(user_id):
    return User(user_id)
@app.route('/write_data, methods =['POST'])
@login_required
@tryton.transaction(user=lambda:current_user.get_id())
def write_data():

```

I get that UserT is NoneType.

Thanks in advance.
