# Need some more detailed tutorial on flask tryton

**URL:** <https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601>\
**Category:** Developer\
**Tags:** flask\
**Created:** [December 23, 2020, 4:30pm UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601 "2020-12-23T16:30:15Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![tryhard](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/t/67e7ee/32.png) [@tryhard](https://discuss.tryton.org/u/tryhard)\
**Post date:** [December 23, 2020, 4:30pm UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/1 "2020-12-23T16:30:15Z")

</div>

Hey guys  
Can anyone teach me(or point me to a site) on how to do flask tryton in more detail than what is on the py website?

---

<div class="post-metadata">

**Author:** ![pokoli](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/pokoli/32/22_2.png) [@pokoli](https://discuss.tryton.org/u/pokoli)\
**Post date:** [December 23, 2020, 8:10pm UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/2 "2020-12-23T20:10:10Z")

</div>

I think there is no such documentation (or at least we are not aware of it).

If you want to learn how to use flask-tryton I will recomend learing first the flask basics and also the tryton basics. Once you are familiar with both concepts using flask-tryton is easier.

---

<div class="post-metadata">

**Author:** ![tryhard](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/t/67e7ee/32.png) [@tryhard](https://discuss.tryton.org/u/tryhard)\
**Post date:** [December 24, 2020, 4:28am UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/3 "2020-12-24T04:28:16Z")

</div>

What basics do i need to learn in tryton?

---

<div class="post-metadata">

**Author:** ![pokoli](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/pokoli/32/22_2.png) [@pokoli](https://discuss.tryton.org/u/pokoli)\
**Post date:** [December 24, 2020, 8:13am UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/4 "2020-12-24T08:13:50Z")

</div>

You need to know how the tryton ORM works as normally flask tryton interact with tryton models to use its data.

Once you have this it depends on the application but you will need to know how the modules you have activated in the database are designed in order to follow it’s usages from flask tryton.

---

<div class="post-metadata">

**Author:** ![pilou](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/p/76d3ee/32.png) [@pilou](https://discuss.tryton.org/u/pilou)\
**Post date:** [December 30, 2020, 7:08pm UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/5 "2020-12-30T19:08:42Z")

</div>

Here is an example which uses [`flask-tryton`](https://pypi.org/project/flask-tryton) and [`web_user`](https://docs.tryton.org/projects/modules-web-user/) for authentication:

> **Click to show the example**
>
> ```python
> from flask import Flask
> from flask_tryton import Tryton
> from flask.ext.babel import Babel
> 
> app = Flask( __name__ )      
> babel = Babel(app)                                                             
> app.config['TRYTON_DATABASE'] = os.environ.get('DB_NAME', 'tryton') 
> tryton = Tryton(app, configure_jinja=True)
> 
> WebUser = tryton.pool.get('web.user')                                          
> Session = tryton.pool.get('web.user.session')                                                                                
> 
> def login_required(func):                                                      
> @wraps(func)                                                               
> def wrapper(*args, **kwargs):                                              
> session_key = None                                                     
> if 'session_key' in session:                                           
> session_key = session['session_key']                               
> user = Session.get_user(session_key)                                   
> if not user:                                                           
> return redirect(url_for('login', next=request.path))               
> return func(*args, **kwargs)                                           
> return wrapper                                                             
> 
> class LoginForm(FlaskForm):                                                    
> email = StringField('Correo Electrónico',                                  
> validators=[DataRequired()],                                           
> render_kw={'placeholder': 'Correo Electrónico'})                       
> password = PasswordField('Contraseña',                                     
> validators=[DataRequired()],                                           
> render_kw={'placeholder': 'Contraseña'})                               
> 
> @app.route('/login', methods=['GET', 'POST'])                                  
> @tryton.transaction()                                                          
> def login():                                                                   
> form = LoginForm()                                                         
> if request.method == 'POST' and form.validate_on_submit():                 
> user = WebUser.authenticate(form.email.data, form.password.data)       
> if user:                                                               
> session['session_key'] = WebUser.new_session(user)                 
> flash('Ahora estas identificado.', 'success')                      
> return redirect(request.form.get('next', url_for('index')))        
> flash('Email o contraseña incorrectos.', 'error')                      
> return render_template(                                                    
> 'login.html',                                                          
> form=form,                                                             
> next=request.args.get('next'))                                         
> 
> @app.route('/logout')                                                          
> @tryton.transaction(readonly=False)                                            
> @login_required                                                                
> def logout():                                                                  
> if session['session_key']:                                                 
> Session.delete(Session.search(                                         
> ('key', '=', session['session_key']),                          
> ))                                                             
> session.pop('session_key', None)                                       
> flash("Se ha desconectado tu sessión", 'success')                      
> return redirect(url_for('index')) 
> 
> @app.route('/')                                                                
> @tryton.transaction()                                                          
> def index():                                                                   
> return render_template('index.html')    
> 
>                                                           
> @app.route('/my-account')                                                       
> @tryton.transaction()                                                          
> @login_required                                                                
> def account():                                                                 
> return render_template('account.html')                                           
> 
> ```

---

<div class="post-metadata">

**Author:** ![pilou](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/p/76d3ee/32.png) [@pilou](https://discuss.tryton.org/u/pilou)\
**Post date:** [December 30, 2020, 7:09pm UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/6 "2020-12-30T19:09:13Z")

</div>

This example was mentioned on [#tryton IRC channel](https://www.tryton.org/~irclog/2020-11-24.log.html) by @pokoli.

---

<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:** [March 2, 2021, 7:55am UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/7 "2021-03-02T07:55:52Z")

</div>

A post was split to a new topic: [How to create a Flask entrypoint to show party](https://discuss.tryton.org/t/how-to-create-a-flask-entrypoint-to-show-party/3876)

---

<div class="post-metadata">

**Author:** ![fransuar](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/f/59ef9b/32.png) [@fransuar](https://discuss.tryton.org/u/fransuar)\
**Post date:** [March 22, 2021, 11:46am UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/8 "2021-03-22T11:46:29Z")

</div>

Hi. Thank you for this good example.  
I am new at flask, so there are somethings I am still learning.  
I try to use this example on my own project, but there is a dictionary call ‘session’, but it isn’t defined anywhere. I could be possible to be this code somehow incomplete.

> [@pilou](#):
>
> ```auto
> @app.route('/login', methods=['GET', 'POST'])                                  
> @tryton.transaction()                                                          
> def login():                                                                   
> form = LoginForm()                                                         
> if request.method == 'POST' and form.validate_on_submit():                 
> user = WebUser.authenticate(form.email.data, form.password.data)       
> if user:                                                               
> session['session_key'] = WebUser.new_session(user)                 
> flash('Ahora estas identificado.', 'success')                      
> return redirect(request.form.get('next', url_for('index')))        
> flash('Email o contraseña incorrectos.', 'error')                      
> return render_template(                                                    
> 'login.html',                                                          
> form=form,                                                             
> next=request.args.get('next'))                  
> 
> ```

Thanks

---

<div class="post-metadata">

**Author:** ![dave](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/d/ee7513/32.png) [@dave](https://discuss.tryton.org/u/dave)\
**Post date:** [March 22, 2021, 11:50am UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/9 "2021-03-22T11:50:00Z")

</div>

> [@fransuar](#):
>
> I try to use this example on my own project, but there is a dictionary call ‘session’, but it isn’t defined anywhere.

I think you may need to do:

```
from flask import session

```

---

<div class="post-metadata">

**Author:** ![fransuar](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/f/59ef9b/32.png) [@fransuar](https://discuss.tryton.org/u/fransuar)\
**Post date:** [March 26, 2021, 1:50pm UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/10 "2021-03-26T13:50:04Z")

</div>

This is a good example to start with. I already implement using part of this code on a simple app.  
Is there any other complex example?  
I am trying to use a flask dashboard template with flask\_tryton, but I have issues to understood how to persist the connection to the tryton database.

---

<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:** [March 26, 2021, 2:01pm UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/11 "2021-03-26T14:01:56Z")

</div>

> [@fransuar](#):
>
> I have issues to understood how to persist the connection to the tryton database

You can not. The connection is started with the decorator `@tryton.transaction` and it is automatically closed on return.

---

<div class="post-metadata">

**Author:** ![fransuar](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/f/59ef9b/32.png) [@fransuar](https://discuss.tryton.org/u/fransuar)\
**Post date:** [March 29, 2021, 10:49am UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/12 "2021-03-29T10:49:37Z")

</div>

> [@ced](#):
>
> You can not. The connection is started with the decorator `@tryton.transaction` and it is automatically closed on return.

Yes! I understood that part.  
Maybe is something I still can get it.  
I have on my app folder the next  
**init.py**

```auto
app = Flask( __name__ , static_folder='base/static')

DEBUG = config('DEBUG', default=True, cast=bool)
get_config_mode = 'Debug' if DEBUG else 'Production'
app_config = config_dict[get_config_mode.capitalize()]
app.config.from_object(app_config)

SECRET_KEY = os.urandom(32)
app.config['SECRET_KEY'] = SECRET_KEY
app.config['TRYTON_DATABASE'] = os.environ.get('trytond','Atlas1.2')
app.config['TRYTON_CONFIG'] = 'trytond.conf'
app.config['TRYTON_USER'] = 1
tryton = Tryton(app, configure_jinja=True)
register_blueprints(app)

Party = tryton.pool.get('party.party')
party = Party.search([('id','>',0)])

```

And it gives me this error:

```auto
  File "run.py", line 10, in <module>
    from app import app
  File "/home/fran/my_flask_apps/salita_dashboard/my_app/app/ __init__.py", line 41, in <module>
    party = Party.search([('id','>',0)])
  File "/home/fran/.virtualenvs/flask-tryton/lib/python3.6/site-packages/trytond/model/modelsql.py", line 1167, in search
    pool = Pool()
  File "/home/fran/.virtualenvs/flask-tryton/lib/python3.6/site-packages/trytond/pool.py", line 58, in __new__
    database_name = Transaction().database.name
AttributeError: 'NoneType' object has no attribute 'name'

```

I use some similar code with the example above with no problems, but now I don’t have a clue on why is giving me this error.  
Any help would be really appreciated. Regards

---

<div class="post-metadata">

**Author:** ![maxx](https://discuss-cdn.tryton.org/user_avatar/discuss.tryton.org/maxx/32/2320_2.png) [@maxx](https://discuss.tryton.org/u/maxx)\
**Post date:** [March 29, 2021, 11:13am UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/13 "2021-03-29T11:13:21Z")

</div>

Try using decorator @tryton.transaction():

```auto
@tryton.transaction()
def get_party():
    Party = tryton.pool.get('party.party')
    party = Party.search([('id','>',0)])
...

```

---

<div class="post-metadata">

**Author:** ![fransuar](https://discuss-cdn.tryton.org/letter_avatar_proxy/v4/letter/f/59ef9b/32.png) [@fransuar](https://discuss.tryton.org/u/fransuar)\
**Post date:** [March 29, 2021, 11:24am UTC](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601/14 "2021-03-29T11:24:34Z")

</div>

Now I get it. Thanks
