Python Flask Framework

Generate SQLA Models

conda install -c conda-forge sqlacodegen
conda install -c bioconda mysqlclient

sqlacodegen mysql://invest:invest@localhost/invest

WTForms & SLQA example using model_form

app.py:

# app.py - https://medium.com/better-programming/how-to-use-flask-wtforms-faab71d5a034
#!bin/python
from flask import Flask, request, render_template
from model import RegForm, User
from flask_bootstrap import Bootstrap

from wtforms.widgets import TableWidget

app = Flask(__name__)
app.config.from_mapping(
    SECRET_KEY=b'\xd6\x04\xbdj\xfe\xed$c\x1e@\xad\x0f\x13,@G')

Bootstrap(app)

@app.route('/', methods=['GET', 'POST'])
def registration():
    form = RegForm(request.form)
    if request.method == 'POST' and form.validate_on_submit():
        user = User()
        form.populate_obj(user)
        user.save()
        return render_template('users.html',  title='Users', users=User.get_all())
        #return 'We confirm your registration {} {}!<br/>{}'.format(user.email, user.name, User.get_df().to_html())
    return render_template('registration.html', form=form)

if __name__ == '__main__':
    app.run()

model.py:

import sqlalchemy as sa
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# from wtforms_alchemy import ModelForm

from flask_wtf import Form
from wtforms.fields import SubmitField
from wtforms.ext.sqlalchemy.orm import model_form

import pandas as pd

#engine = create_engine('sqlite:///:memory:', echo=True)
engine = create_engine('sqlite:///user.db', echo=True)

Base = declarative_base(engine)
Session = sessionmaker(bind=engine)
session = Session()

class User(Base):
    __tablename__ = 'user'

    id = sa.Column(sa.Integer, autoincrement=True, primary_key=True)
    name = sa.Column(sa.Unicode(100), nullable=False)
    email = sa.Column(sa.Unicode(255), nullable=False)

    # Ued with DataTable
    def dt_header(self):
            return '<thead><tr><th>{}</th><th>{}</th><th>{}</th></tr></thead><tbody>'.format('id', 'name', 'email')

    def dt_footer(self):
            return '</tbody><tfoot><tr><th>{}</th><th>{}</th><th>{}</th></tr></tfoot>'.format('id', 'name', 'email')

    def __repr__(self):
            return '<tr><td>{}r</td><td>{}</td><td>{}</td></tr>'.format(self.id, self.name, self.email)

    def save(self):
        global session
        session.add(self)
        session.commit()

    def get_all():
        global session
        return session.query(User)

    def get_df():
        global session
        q = session.query(User)
        return pd.read_sql(q.statement, q.session.bind)


RegForm = model_form(User, base_class=Form)
RegForm.submit = SubmitField('Create')

Base.metadata.create_all(engine)

templates/registration.html:

# templates/registration.html
{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block content %}
<div class="container">
  <h3>Create your account</h3>
  <hr>
    {{ wtf.quick_form(form) }}
  <hr>
  <p>Open one account - All humans working for you.</p>
  <p><a href="#">Sign in instead</a></p>
</div>
{% endblock %}

templates/users.html:

# templates/registration.html
{% extends "bootstrap/base.html" %}
{% import "bootstrap/wtf.html" as wtf %}
{% block content %}
<div class="container">
  <h3>Users</h3>

  <ul>
  {% for user in users %}
    <li>{{ user }}</li>
  {% endfor %}
  </ul>

  <p><a href='/'>Add new</a></p>

</div>
{% endblock %}

Run the app:

export FLASK_APP=app.py
flask run

Resources