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