Home / File/ auth.py — flask Source File

auth.py — flask Source File

Architecture documentation for auth.py, a python file in the flask codebase. 5 imports, 1 dependents.

File python ApplicationCore ExtensionRegistry 5 imports 1 dependents 5 functions

Entity Profile

Dependency Diagram

graph LR
  749d9792_d880_75ed_5ccb_68e2218e2db3["auth.py"]
  09048b06_50a3_09e1_0ff4_ee97994a3e9b["db.py"]
  749d9792_d880_75ed_5ccb_68e2218e2db3 --> 09048b06_50a3_09e1_0ff4_ee97994a3e9b
  adc04a87_eacf_cc39_8808_98d7d38c7044["get_db"]
  749d9792_d880_75ed_5ccb_68e2218e2db3 --> adc04a87_eacf_cc39_8808_98d7d38c7044
  3eebf5bc_1ef0_6524_701b_beec8ec8524a["functools"]
  749d9792_d880_75ed_5ccb_68e2218e2db3 --> 3eebf5bc_1ef0_6524_701b_beec8ec8524a
  8c762fc5_c0b6_0d4d_3889_896d80fbf225["flask"]
  749d9792_d880_75ed_5ccb_68e2218e2db3 --> 8c762fc5_c0b6_0d4d_3889_896d80fbf225
  c064b645_acb1_3269_4e88_d0ee8232789e["werkzeug.security"]
  749d9792_d880_75ed_5ccb_68e2218e2db3 --> c064b645_acb1_3269_4e88_d0ee8232789e
  bf08e60d_e030_cf15_e246_1de85afd9b5e["blog.py"]
  bf08e60d_e030_cf15_e246_1de85afd9b5e --> 749d9792_d880_75ed_5ccb_68e2218e2db3
  style 749d9792_d880_75ed_5ccb_68e2218e2db3 fill:#6366f1,stroke:#818cf8,color:#fff

Relationship Graph

Source Code

import functools

from flask import Blueprint
from flask import flash
from flask import g
from flask import redirect
from flask import render_template
from flask import request
from flask import session
from flask import url_for
from werkzeug.security import check_password_hash
from werkzeug.security import generate_password_hash

from .db import get_db

bp = Blueprint("auth", __name__, url_prefix="/auth")


def login_required(view):
    """View decorator that redirects anonymous users to the login page."""

    @functools.wraps(view)
    def wrapped_view(**kwargs):
        if g.user is None:
            return redirect(url_for("auth.login"))

        return view(**kwargs)

    return wrapped_view


@bp.before_app_request
def load_logged_in_user():
    """If a user id is stored in the session, load the user object from
    the database into ``g.user``."""
    user_id = session.get("user_id")

    if user_id is None:
        g.user = None
    else:
        g.user = (
            get_db().execute("SELECT * FROM user WHERE id = ?", (user_id,)).fetchone()
        )


@bp.route("/register", methods=("GET", "POST"))
def register():
    """Register a new user.

    Validates that the username is not already taken. Hashes the
    password for security.
    """
    if request.method == "POST":
        username = request.form["username"]
        password = request.form["password"]
        db = get_db()
        error = None

        if not username:
            error = "Username is required."
        elif not password:
            error = "Password is required."

        if error is None:
            try:
                db.execute(
                    "INSERT INTO user (username, password) VALUES (?, ?)",
                    (username, generate_password_hash(password)),
                )
                db.commit()
            except db.IntegrityError:
                # The username was already taken, which caused the
                # commit to fail. Show a validation error.
                error = f"User {username} is already registered."
            else:
                # Success, go to the login page.
                return redirect(url_for("auth.login"))

        flash(error)

    return render_template("auth/register.html")


@bp.route("/login", methods=("GET", "POST"))
def login():
    """Log in a registered user by adding the user id to the session."""
    if request.method == "POST":
        username = request.form["username"]
        password = request.form["password"]
        db = get_db()
        error = None
        user = db.execute(
            "SELECT * FROM user WHERE username = ?", (username,)
        ).fetchone()

        if user is None:
            error = "Incorrect username."
        elif not check_password_hash(user["password"], password):
            error = "Incorrect password."

        if error is None:
            # store the user id in a new session and return to the index
            session.clear()
            session["user_id"] = user["id"]
            return redirect(url_for("index"))

        flash(error)

    return render_template("auth/login.html")


@bp.route("/logout")
def logout():
    """Clear the current session, including the stored user id."""
    session.clear()
    return redirect(url_for("index"))

Subdomains

Dependencies

Frequently Asked Questions

What does auth.py do?
auth.py is a source file in the flask codebase, written in python. It belongs to the ApplicationCore domain, ExtensionRegistry subdomain.
What functions are defined in auth.py?
auth.py defines 5 function(s): load_logged_in_user, login, login_required, logout, register.
What does auth.py depend on?
auth.py imports 5 module(s): db.py, flask, functools, get_db, werkzeug.security.
What files import auth.py?
auth.py is imported by 1 file(s): blog.py.
Where is auth.py in the architecture?
auth.py is located at examples/tutorial/flaskr/auth.py (domain: ApplicationCore, subdomain: ExtensionRegistry, directory: examples/tutorial/flaskr).

Analyze Your Own Codebase

Get architecture documentation, dependency graphs, and domain analysis for your codebase in minutes.

Try Supermodel Free