# 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:** 1\
**Showing post:** 5

<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')                                           
> 
> ```

---

_[View the full topic](https://discuss.tryton.org/t/need-some-more-detailed-tutorial-on-flask-tryton/3601)._
