Подписывайтесь:

Блог AST-SoftPro

Корпоративный сайт-визитка на Flask: услуги, портфолио и форма обратной связи

15.06.2026 7 мин чтения
Корпоративный сайт-визитка на Flask: услуги, портфолио и форма обратной связи

Создание корпоративного сайта на Flask

Корпоративный сайт-визитка — это первое, что видят потенциальные клиенты о компании. Он должен быть быстрым, адаптивным и содержать ключевую информацию: услуги, портфолио, контакты и форму обратной связи.

Flask — идеальный фреймворк для таких задач. Он лёгкий, не навязывает структуру и позволяет создать полноценный сайт за один вечер. В отличие от Django, Flask не тянет за собой ORM и админку — вы берёте только то, что нужно.

Структура проекта

Минимальная структура сайта-визитки:

mycompany_site/
├── app.py              # Главный файл приложения
├── config.py           # Настройки (email, API-ключи)
├── templates/
│   ├── base.html       # Базовый шаблон (header, footer)
│   ├── index.html      # Главная страница
│   ├── services.html   # Страница услуг
│   ├── portfolio.html  # Портфолио
│   └── contact.html    # Контакты и форма
├── static/
│   ├── css/style.css   # Стили
│   └── images/         # Логотип, фото
└── requirements.txt

Настройка Flask-приложения

from flask import Flask, render_template, request, flash, redirect, url_for
from flask_mail import Mail, Message
import os

app = Flask(__name__)
app.secret_key = os.getenv('SECRET_KEY', 'change-me-in-production')

# Настройка почты
app.config['MAIL_SERVER'] = 'smtp.gmail.com'
app.config['MAIL_PORT'] = 587
app.config['MAIL_USE_TLS'] = True
app.config['MAIL_USERNAME'] = os.getenv('MAIL_USERNAME')
app.config['MAIL_PASSWORD'] = os.getenv('MAIL_PASSWORD')
app.config['MAIL_DEFAULT_SENDER'] = os.getenv('MAIL_USERNAME')
mail = Mail(app)

# Страницы сайта
@app.route('/')
def index():
    return render_template('index.html',
        title='Главная',
        slogan='Профессиональные решения для вашего бизнеса')

@app.route('/services')
def services():
    services_list = [
        {'name': 'Веб-разработка', 'desc': 'Создание сайтов и веб-приложений'},
        {'name': 'Мобильные приложения', 'desc': 'iOS и Android под ключ'},
        {'name': 'Консалтинг', 'desc': 'Аудит IT-инфраструктуры и стратегии'},
    ]
    return render_template('services.html', services=services_list)

@app.route('/portfolio')
def portfolio():
    projects = [
        {'name': 'CRM-система', 'client': 'ООО "Компания"', 'tech': 'Django, PostgreSQL'},
        {'name': 'Интернет-магазин', 'client': 'IP Иванов', 'tech': 'Flask, Stripe'},
    ]
    return render_template('portfolio.html', projects=projects)

@app.route('/contact', methods=['GET', 'POST'])
def contact():
    if request.method == 'POST':
        name = request.form.get('name', '').strip()
        email = request.form.get('email', '').strip()
        message = request.form.get('message', '').strip()

        if not name or not email or not message:
            flash('Заполните все поля', 'error')
            return redirect(url_for('contact'))

        try:
            msg = Message(
                subject=f'Заявка с сайта: {name}',
                recipients=[os.getenv('MAIL_USERNAME')],
                body=f'Имя: {name}\nEmail: {email}\n\n{message}'
            )
            mail.send(msg)
            flash('Сообщение отправлено!', 'success')
            return redirect(url_for('contact'))
        except Exception as e:
            flash(f'Ошибка отправки: {e}', 'error')

    return render_template('contact.html')

if __name__ == '__main__':
    app.run(debug=True)

Базовый шаблон (base.html)

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}{{ title }}{% endblock %}</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
</head>
<body>
    <nav>
        <a href="/">Главная</a>
        <a href="/services">Услуги</a>
        <a href="/portfolio">Портфолио</a>
        <a href="/contact">Контакты</a>
    </nav>

    <main>
        {% with messages = get_flashed_messages(with_categories=true) %}
            {% for category, msg in messages %}
                <div class="alert {{ category }}">{{ msg }}</div>
            {% endfor %}
        {% endwith %}

        {% block content %}{% endblock %}
    </main>

    <footer>
        <p>&copy; 2026 Название компании. Все права защищены.</p>
    </footer>
</body>
</html>

Сравнение Flask и Django для сайта-визитки

Критерий Flask Django
Скорость разработки Быстро для простых сайтов Быстро за счёт готовых модулей
Гибкость Полная — вы сами выбираете компоненты Меньше — навязывает структуру
База данных Опционально (SQLAlchemy) Встроенная ORM
Админ-панель Нет (Flask-Admin) Встроенная
Размер деплоя ~2 MB ~15 MB
Подход Micro-framework, minimalistic Batteries-included, monolithic

Flask лучше подходит, когда сайт-визитка не требует базы данных и админки — только статические страницы + форма обратной связи.

Деплой сайта на продакшен

Для продакшена используется связка Gunicorn + Nginx:

# requirements.txt
Flask==3.1.0
Flask-Mail==0.10.0
gunicorn==23.0.0

# Запуск
gunicorn --workers 2 --bind 0.0.0.0:8000 app:app

Минимальная конфигурация Nginx:

server {
    listen 80;
    server_name example.com;

    location /static/ {
        alias /home/app/mycompany_site/static/;
    }

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

SEO-основы для корпоративного сайта

Чтобы сайт индексировался поисковыми системами:

  • Уникальный <title> и <meta name="description"> на каждой странице;

  • Семантические теги (<header>, <main>, <footer>, <section>);

  • Адаптивная вёрстка (mobile-first);

  • Быстрая загрузка — минимизируйте CSS/JS, сжимайте изображения;

  • robots.txt и sitemap.xml в корне сайта.

Заключение

Flask — оптимальный выбор для корпоративного сайта-визитки. Минимальный код, чистая структура, быстрая загрузка. Ключевые компоненты:

  • Маршруты для каждой страницы (главная, услуги, портфолио, контакты);

  • Форма обратной связи с отправкой email через Flask-Mail;

  • Базовый шаблон с навигацией и футером;

  • Деплой через Gunicorn + Nginx.

Такой сайт можно создать за один вечер и развернуть на VPS за час.


AI-Помощник