User Registration Flow
A typical registration flow:
- User fills a registration form
- Backend validates fields (username/email uniqueness)
- Password is hashed
- User row is created
- Optionally log the user in
flowchart TD
A["GET /register"] --> B["render the form"]
B --> C["POST /register"]
C --> D{"all fields present?"}
D -->|no| E["flash error, redirect back"]
D -->|yes| F{"username already taken?"}
F -->|yes| E
F -->|no| G{"email already registered?"}
G -->|yes| E
G -->|no| H["generate_password_hash(password)"]
H --> I["db.session.add(user)"]
I --> J["db.session.commit()"]
J --> K["login_user(user)"]
K --> L["redirect to dashboard"]
E --> B
Model fields (example)
Section titled “Model fields (example)”username(unique)email(unique)password_hash
Example (simplified)
Section titled “Example (simplified)”from flask import request, redirect, url_for, flash
from werkzeug.security import generate_password_hash
from flask_login import login_user
@app.route("/register", methods=["GET", "POST"])
def register():
if request.method == "POST":
username = request.form.get("username", "").strip()
email = request.form.get("email", "").strip().lower()
password = request.form.get("password", "")
if not username or not email or not password:
flash("All fields are required", "error")
return redirect(url_for("register"))
if User.query.filter_by(username=username).first():
flash("Username already taken", "error")
return redirect(url_for("register"))
if User.query.filter_by(email=email).first():
flash("Email already registered", "error")
return redirect(url_for("register"))
user = User(
username=username,
email=email,
password_hash=generate_password_hash(password),
)
db.session.add(user)
db.session.commit()
login_user(user)
flash("Welcome! Your account was created.", "success")
return redirect(url_for("dashboard"))
return "Register page"Next improvements
Section titled “Next improvements”For production-quality registration:
- use Flask-WTF validators
- password policy (length/complexity)
- email verification
- rate limiting
- audit logging
pch.coffeeTagline
pch.coffeeCtapch.feedbackHeading
pch.feedbackSubheading