Приложение для блога на Flask

Beginner

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

Введение

В этом практическом занятии мы рассмотрим создание веб-приложения для блога с использованием фреймворка Flask, популярного в Python. Данное приложение будет отображать все записи блога, позволять зарегистрированным пользователям создавать записи и авторам редактировать или удалять свои записи.

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

Определение Blueprint

Во - первых, мы определим Blueprint для нашего блога. Blueprint - это способ организации группы связанных представлений и другого кода.

## flaskr/blog.py

from flask import Blueprint, flash, g, redirect, render_template, request, url_for
from werkzeug.exceptions import abort

from flaskr.auth import login_required
from flaskr.db import get_db

## Blueprint назван 'blog'. Он определяется в том же файле.
## Blueprint должен знать, где он определен, поэтому __name__ передается в качестве второго аргумента.
bp = Blueprint('blog', __name__)

Регистрация Blueprint

Далее мы зарегистрируем Blueprint в нашем приложении.

## flaskr/__init__.py

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

    ## импортируем и регистрируем Blueprint из фабрики с использованием app.register_blueprint()
    from. import blog
    app.register_blueprint(blog.bp)
    app.add_url_rule('/', endpoint='index')

    return app

Создание индекса блога

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

## flaskr/blog.py

@bp.route('/')
def index():
    db = get_db()
    posts = db.execute(
        'SELECT p.id, title, body, created, author_id, username'
        ' FROM post p JOIN user u ON p.author_id = u.id'
        ' ORDER BY created DESC'
    ).fetchall()
    return render_template('blog/index.html', posts=posts)

Создание записи

Далее мы создадим представление, которое позволит зарегистрированным пользователям создавать новые записи блога.

## flaskr/blog.py

@bp.route('/create', methods=('GET', 'POST'))
@login_required
def create():
    if request.method == 'POST':
        title = request.form['title']
        body = request.form['body']
        error = None

        if not title:
            error = 'Title is required.'

        if error is not None:
            flash(error)
        else:
            db = get_db()
            db.execute(
                'INSERT INTO post (title, body, author_id)'
                ' VALUES (?,?,?)',
                (title, body, g.user['id'])
            )
            db.commit()
            return redirect(url_for('blog.index'))

    return render_template('blog/create.html')

Редактирование записи

Добавим возможность авторам редактировать свои собственные записи. Чтобы избежать дублирования кода, создадим вспомогательную функцию для получения записи и проверки, является ли текущий пользователь автором.

## flaskr/blog.py

@bp.route('/<int:id>/update', methods=('GET', 'POST'))
@login_required
def update(id):
    post = get_post(id)

    if request.method == 'POST':
        title = request.form['title']
        body = request.form['body']
        error = None

        if not title:
            error = 'Title is required.'

        if error is not None:
            flash(error)
        else:
            db = get_db()
            db.execute(
                'UPDATE post SET title =?, body =?'
                ' WHERE id =?',
                (title, body, id)
            )
            db.commit()
            return redirect(url_for('blog.index'))

    return render_template('blog/update.html', post=post)

Удаление записи

Наконец, добавим возможность авторам удалять свои собственные записи.

## flaskr/blog.py

@bp.route('/<int:id>/delete', methods=('POST',))
@login_required
def delete(id):
    get_post(id)
    db = get_db()
    db.execute('DELETE FROM post WHERE id =?', (id,))
    db.commit()
    return redirect(url_for('blog.index'))

Резюме

Поздравляем, вы создали простое веб - приложение для блога с использованием Flask! Данное приложение поддерживает аутентификацию пользователей и позволяет им создавать, редактировать и удалять свои собственные записи блога.