You'd use Flask-WTF for forms.
https://flask-wtf.readthedocs.org/en/latest/
It can also handle file uploads.
https://flask-wtf.readthedocs.org/en/latest/form.html
You'd need to define a model which describes the form fields, handle it in your view, and add it to your page template.
forms.py
from flask_wtf import Form
from wtforms import TextField, PasswordField
from wtforms.validators import DataRequired
class LoginForm(Form):
email = TextField('Email', validators=[DataRequired()])
password = PasswordField('Password', validators=[DataRequired()])
views.py from forms import LoginForm
@app.route('/login', methods=('GET', 'POST'))
def login():
form = LoginForm()
if form.validate_on_submit():
email = form.data.get('email', None)
password = form.data.get('password', None)
do_login_stuff(email, password)
else:
return render_template('login_page.html', form=form)
login_page.html {% extends "base.html" %}
{% block content %}
<h3>Log in:</h3>
<form method="POST" action="{{ url_for('login') }}">
{{ form.hidden_tag() }}
{{ form.email.label }} {{ form.email }}
{{ form.password.label }} {{ form.password }}
<input type="submit" value="Log in">
</form>
{% endblock %}