惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

T
Tenable Blog
S
SegmentFault 最新的问题
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
博客园 - 聂微东
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
美团技术团队
Recorded Future
Recorded Future
Microsoft Security Blog
Microsoft Security Blog
博客园 - 叶小钗
P
Proofpoint News Feed
aimingoo的专栏
aimingoo的专栏
博客园_首页
宝玉的分享
宝玉的分享
C
Check Point Blog
爱范儿
爱范儿
MyScale Blog
MyScale Blog
Microsoft Azure Blog
Microsoft Azure Blog
The Register - Security
The Register - Security
U
Unit 42
T
Tailwind CSS Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
D
Docker
博客园 - Franky
博客园 - 【当耐特】
腾讯CDC
N
Netflix TechBlog - Medium
Jina AI
Jina AI
博客园 - 司徒正美
Last Week in AI
Last Week in AI
PCI Perspectives
PCI Perspectives
GbyAI
GbyAI
Security Archives - TechRepublic
Security Archives - TechRepublic
J
Java Code Geeks
Cloudbric
Cloudbric
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Y
Y Combinator Blog
F
Full Disclosure
TaoSecurity Blog
TaoSecurity Blog
N
News and Events Feed by Topic
L
LINUX DO - 最新话题
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
小众软件
小众软件
O
OpenAI News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
S
Security Affairs
Recent Announcements
Recent Announcements
Attack and Defense Labs
Attack and Defense Labs
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
S
Secure Thoughts

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Streamlit для внутренних GUI: быстрый и гибкий low-code инструмент
Malagor031 · 2026-05-08 · via Все публикации подряд на Хабре

Уровень сложностиПростой

Время на прочтение5 мин

Охват и читатели592

Кейс

В эпоху вайбкодинга удивить кого‑то базовым веб‑интерфейсом сложно. Но сделать его понятным и простым в поддержке — другой вопрос. Если вы хотите обернуть свои скрипты\автоматизацию в красивую обертку, а также сделать это быстро и просто — я нашел для вас классную библиотеку на python.

Цель статьи — поделиться классным инструментом и замотивировать вас к созданию нового. Поехали!


Небольшая вводная. Многие в ИТ создают свои пет проекты и, конечно, хочется какой‑нибудь красоты — такой чтобы и коллеги позавидовали и не пришлось изучать сотню инструментов frontend`a. А может вам нужны простые GUI для внутреннего проекта? Долго я искал что‑то простое и вот... представляю вам streamlit. Библиотека на python для создания простых веб‑интерфейсов. В первую очередь она зацепила меня тем что она невероятно простая и позволяет прототипировать все максимально быстро.

В отличии от low‑code аналогов — AppSmith и Budibase, это все же код, с присущей ему гибкостью, а не конструктор.

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

Пишем код

Сразу отмечу, что я не разработчик и далек от профи python, простой DevOps с нотками golang.

Шаг 1) Скачиваем. Тут все просто

pip install streamlit

Шаг 2) Используем и радуемся

import streamlit as st

st.title("prod deployer")

def cool_deploy():
    ...
    

if st.button("deploy to prod!"):
    cool_deploy()
streamlit run app.py
наш первый GUI

наш первый GUI

Вот такая веб страничка у нас выходит. На всё, про всё -+ 5 минут. Но одной кнопки мало, нужно больше функционала...

Еще одна функция и спать...

Построим что-то серьезное. Хочу по кнопке... yaml манифест в K8s разворачивать. Это Argo манифест который подготавливает инфраструктуру под какой-нибудь проект. Пример постараюсь привести максимально понятный, но без k8s не могу — профдеформация DevOps (

Наше приложение
import streamlit as st
from kubernetes import client, config
from kubernetes.client.rest import ApiException


# Для взаимодействия с кластером Kubernetes нам нужен конфиг, 
# получаем его так
def load_kube_config():
    try:
        config.load_incluster_config()
    except config.ConfigException:
        config.load_kube_config()


# Генерация манифеста для K8S. 
# В проде, конечно, возможно задать больше функций 
def build_application_set(name: str) -> dict:

    return {
        "apiVersion": "argoproj.io/v1alpha1",
        "kind": "ApplicationSet",
        "metadata": {
            "name": f"ministand-{name}",
            "namespace": "argo-cd",
        },
        "spec": {
            "template": {
                "metadata": {
                    "name": f"{name}-app",
                },
                "spec": {
                    "project": "default",
                    "destination": {
                        "server": "https://kubernetes.default.svc",
                        "namespace": f"ministand-{name}",
                    },
                },
            },
        },
    }


# Деплой стенда через K8S API
def deploy_stand(name: str):
    api = client.CustomObjectsApi()
    manifest = build_application_set(name)

    try:
        # применение манифеста в k8s, обращение к API
        api.create_namespaced_custom_object(
            group="argoproj.io",
            version="v1alpha1",
            namespace="argo-cd",
            plural="applicationsets",
            body=manifest,
        )
        st.success(f"✅ Стенд {name} создан")
        st.rerun()

    except ApiException as e:
        if e.status == 409:
            st.error(f"❗ Стенд {name} уже существует")
        else:
            st.error(f"Ошибка: {e}")


# Получение списка стендов в кластере K8S
def get_stands():
    api = client.CustomObjectsApi()

    try:
        resp = api.list_namespaced_custom_object(
            group="argoproj.io",
            version="v1alpha1",
            namespace="argo-cd",
            plural="applicationsets",
        )
        return resp.get("items", [])

    except ApiException as e:
        st.error(f"Ошибка Kubernetes API: {e}")
        return []


# Самое главное - UI 
st.set_page_config(page_title="Stand Manager", layout="wide")
st.title("🛠️ Менеджер стендов")


# Инициализация один раз
if "kube_loaded" not in st.session_state:
    load_kube_config()
    st.session_state["kube_loaded"] = True


# Тут красиво оформляем список стендов, 
# примеры того как это выглядит на проде будут ниже
stands = get_stands()
for stand in stands:
    st.subheader(stand["metadata"]["name"])

    col1, col2, col3 = st.columns([4, 1, 1])

    # Название
    with col1:
        st.subheader(stand["metadata"]["name"])


    # Открыть
    with col2:
        if st.button("Открыть", key=stand["metadata"]["uid"]):
            # Тут должна быть функция раскрытия подробностей

    # Удалить
    with col3:
        if st.button("Удалить", key="del-" + stand["metadata"]["uid"]):
            # Тут должна быть функция удаления


st.divider()


# Форма создания нового стенда

st.subheader("🚀 Новый стенд")

with st.form("deploy_form"):
    name = st.text_input("Имя стенда")

    if st.form_submit_button("Создать"):
        deploy_stand(name)

По итогу у нас вышло весьма стильно

Красивые GUI за 10 минут

Красивые GUI за 10 минут

Некоторые функции пришлось стереть, а что-то (например деплой отдельных сервисов) подсократить. Но моя задача — показать идею. Да и мне по голове настучат если покажу лишние ссылки :)

Также примеры простеньких интерфейсов вы можете подсмотреть в официальной галерее проектов.

Минута вдохновения

Разобрали как начать, а теперь посмотрим на тот максимум который можно выжать из этой библиотеки. Представляю вам свой Magnum opus — BLOCKCHAIN HUB

(напоминаю что я DevOps, а не разработчик. Палками не кидайтесь)

Главный экран хаба

Главный экран хаба

Небольшое описание некоторого функционала
Обрамитель

Обрамитель

То с чего все начиналось, просто обрамляет строки. Потрясающе обрамляет, попрошу заметить!

Таймлайн k8s

Таймлайн k8s

Жалко в динамике не показать...
поверьте что красиво и удобно! (кроме дизайна... цвета не самые удачные)

Даже просмотр таблиц с графиками завезли!

Просмотр таблиц в БД

Просмотр таблиц в БД

И тот самый деплой сервисов который вы видели в коде выше

Своя платформа для деплоя

Своя платформа для деплоя

И не надо аналитику / разрабу разбираться что там и как в этих ваших пайплайнах и ансиблах. Захотел — запустил / откатил / поменял версию — всё по клику! magic

Минусы и нюансы с которыми мы столкнулись

  1. Потребление памяти. Образы того же хаба из примера выше со всеми зависимостями выходят +- до 1.2Гб. В простое приложение ест 200-500Мб как нечего делать. С другой сторону у нас тут low-code инструмент, без жертв не обойтись.

  2. Перезагрузка страницы. При взаимодействии streamlit каждый раз перезагружает страницу. Нажатие кнопки? Перезагрузка. Ввел что-то в поле ввода? Перезагрузка.
    Чтобы избежать большой нагрузки на приложение используйте декоратор @st.cache_data (дока)

  3. Пишут что тяжело с большим количеством одновременных юзеров, но проверить на своем опыте не удалось. Сейчас одновременно могут пользоваться человек 5–6 и полёт нормальный

  4. Авторизация. Легко накосячить с контролем доступа, так что смотрите в оба. В полноценный продакшн я бы без нескольких оберток с авторизацией такое не пускал.
    В своем проекте поставил streamlit-cookies-manager, авторизацию по LDAP и несколько доработок сверху

  5. Напоследок — здесь вы можете найти кучу новый компонентов для библиотеки — от webRTC до shadcn компонентов, что сильно сократит время разработки

Итоги

Вот такой интересный «конструктор» вам показал, надеюсь кого‑нибудь эта статья вдохновит на создание чего‑то классного, может даже за пределами пет‑проектов. Сам уже несколько лет тяну бремя DevOps / SRE и подход c такими интерфейсами для команды лично мне очень зашел.

Можно обернуть любой сложный процесс в GUI с кнопками и это поймет даже человек, незнакомый с такими понятиями как «деплой»... ну ведь красота!

Но помните — с красивым сервисом приходит большая ответственность, в том числе за его поддержку

Всем классных проектов!