Модульное веб-приложение на Flask с аутентификацией

FlaskFlaskBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

В этом практическом занятии мы рассмотрим, как создавать и использовать блюпринты Flask для структурирования вашего приложения с использованием представлений. Блюпринты Flask позволяют группировать связанные представления, код и ресурсы, делая ваше приложение модульным и масштабируемым. Мы создадим простое приложение, которое будет включать в себя функциональность аутентификации пользователей и блоговых постов.

Примечание: вам нужно создать файл кода самостоятельно и запустить его в среде. Вы можете просмотреть статус сервиса Flask на Web 5000.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL flask(("Flask")) -.-> flask/DataHandlingGroup(["Data Handling"]) flask(("Flask")) -.-> flask/CoreConceptsGroup(["Core Concepts"]) flask(("Flask")) -.-> flask/DevelopmentToolsGroup(["Development Tools"]) flask/DataHandlingGroup -.-> flask/incoming_request_data("Incoming Request Data") flask/CoreConceptsGroup -.-> flask/application_object("Application Object") flask/CoreConceptsGroup -.-> flask/session_interface("Session Interface") flask/CoreConceptsGroup -.-> flask/json_support("JSON Support") flask/CoreConceptsGroup -.-> flask/class_based_views("Class-Based Views") flask/CoreConceptsGroup -.-> flask/useful_internals("Useful Internals") flask/DevelopmentToolsGroup -.-> flask/blueprint_objects("Blueprint Objects") flask/DevelopmentToolsGroup -.-> flask/command_line_interface("Command Line Interface") subgraph Lab Skills flask/incoming_request_data -.-> lab-136337{{"Модульное веб-приложение на Flask с аутентификацией"}} flask/application_object -.-> lab-136337{{"Модульное веб-приложение на Flask с аутентификацией"}} flask/session_interface -.-> lab-136337{{"Модульное веб-приложение на Flask с аутентификацией"}} flask/json_support -.-> lab-136337{{"Модульное веб-приложение на Flask с аутентификацией"}} flask/class_based_views -.-> lab-136337{{"Модульное веб-приложение на Flask с аутентификацией"}} flask/useful_internals -.-> lab-136337{{"Модульное веб-приложение на Flask с аутентификацией"}} flask/blueprint_objects -.-> lab-136337{{"Модульное веб-приложение на Flask с аутентификацией"}} flask/command_line_interface -.-> lab-136337{{"Модульное веб-приложение на Flask с аутентификацией"}} end

Создайте блюпринт

Давайте начнем с создания блюпринта для нашего приложения. Этот блюпринт будет называться 'auth' и будет обрабатывать представления, связанные с аутентификацией пользователей. Мы определим наш блюпринт в отдельном модуле с именем flaskr/auth.py.

## flaskr/auth.py

import functools
from flask import Blueprint, flash, g, redirect, render_template, request, session, url_for
from werkzeug.security import check_password_hash, generate_password_hash
from flaskr.db import get_db

## Создайте блюпринт с именем 'auth'
bp = Blueprint('auth', __name__, url_prefix='/auth')

Зарегистрируйте блюпринт

После создания блюпринта нам нужно зарегистрировать его в нашем приложении. Это делается в функции-фабрике приложения в flaskr/__init__.py.

## flaskr/__init__.py

def create_app():
    app =...
    ## существующий код опущен

    ## Импортируйте и зарегистрируйте блюпринт
    from. import auth
    app.register_blueprint(auth.bp)

    return app

Реализуйте представление регистрации

Теперь давайте реализуем представление регистрации в flaskr/auth.py. Это представление будет отображать форму регистрации и обрабатывать отправку формы.

## flaskr/auth.py

@bp.route('/register', methods=('GET', 'POST'))
def register():
    if request.method == 'POST':
        username = request.form['username']
        password = request.form['password']
        db = get_db()
        error = None

        if not username:
            error = 'Имя пользователя обязательно.'
        elif not password:
            error = 'Пароль обязателен.'

        if error is None:
            try:
                db.execute(
                    "INSERT INTO user (username, password) VALUES (?,?)",
                    (username, generate_password_hash(password)),
                )
                db.commit()
            except db.IntegrityError:
                error = f"Пользователь {username} уже зарегистрирован."
            else:
                return redirect(url_for("auth.login"))

        flash(error)

    return render_template('auth/register.html')

Реализуйте представление входа

Далее мы реализуем представление входа в flaskr/auth.py. Это представление будет обрабатывать функциональность входа пользователя.

## flaskr/auth.py

@bp.route('/login', methods=('GET', 'POST'))
def login():
    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 = 'Неверное имя пользователя.'
        elif not check_password_hash(user['password'], password):
            error = 'Неверный пароль.'

        if error is None:
            session.clear()
            session['user_id'] = user['id']
            return redirect(url_for('index'))

        flash(error)

    return render_template('auth/login.html')

Реализуйте представление выхода

Теперь давайте добавим представление выхода в flaskr/auth.py. Это представление будет обрабатывать функциональность выхода пользователя.

## flaskr/auth.py

@bp.route('/logout')
def logout():
    session.clear()
    return redirect(url_for('index'))

Реализуйте декоратор требующий аутентификации

Нам также понадобится декоратор для защиты наших представлений, которые требуют аутентификации пользователя. Этот декоратор будет реализован в flaskr/auth.py.

## flaskr/auth.py

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

        return view(**kwargs)

    return wrapped_view

Резюме

В этом практическом занятии мы научились использовать блюпринты Flask для структурирования нашего приложения. Мы создали блюпринт для аутентификации пользователей и реализовали представления регистрации, входа и выхода. Также мы реализовали декоратор для защиты представлений, требующих аутентификации пользователя. С этими знаниями вы теперь можете структурировать свои приложения Flask в модульном и масштабируемом стиле.