Блог AST-SoftPro
Корпоративный сайт-визитка на 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>© 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 за час.