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

推荐订阅源

爱范儿
爱范儿
Simon Willison's Weblog
Simon Willison's Weblog
K
Kaspersky official blog
P
Palo Alto Networks Blog
Google DeepMind News
Google DeepMind News
www.infosecurity-magazine.com
www.infosecurity-magazine.com
AI
AI
G
GRAHAM CLULEY
O
OpenAI News
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Help Net Security
Help Net Security
L
LINUX DO - 热门话题
S
Schneier on Security
P
Privacy International News Feed
L
Lohrmann on Cybersecurity
SecWiki News
SecWiki News
C
Cybersecurity and Infrastructure Security Agency CISA
T
Threatpost
C
Cyber Attacks, Cyber Crime and Cyber Security
A
Arctic Wolf
C
Cisco Blogs
V2EX - 技术
V2EX - 技术
有赞技术团队
有赞技术团队
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
Latest news
Latest news
人人都是产品经理
人人都是产品经理
Schneier on Security
Schneier on Security
Last Week in AI
Last Week in AI
Webroot Blog
Webroot Blog
美团技术团队
N
News and Events Feed by Topic
大猫的无限游戏
大猫的无限游戏
Security Archives - TechRepublic
Security Archives - TechRepublic
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
博客园 - 三生石上(FineUI控件)
The Cloudflare Blog
Project Zero
Project Zero
博客园_首页
Cloudbric
Cloudbric
IT之家
IT之家
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
雷峰网
雷峰网
罗磊的独立博客
Hacker News: Ask HN
Hacker News: Ask HN
The Last Watchdog
The Last Watchdog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tenable Blog
Scott Helme
Scott Helme

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

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет 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 миллионов точек без потерь
Возвращение блудного программиста (ч.3)
VAnderskaeV · 2026-04-29 · via Все публикации подряд на Хабре

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

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

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

Туториал

В предыдущих "сериях"

Часть 1

Часть 2

Содержание

Вместо введения

Эта часть будет практической, если помните я решил углубиться в React и Flask. Поэтому при помощи ИИ начинаю. Нет, ИИ не будет делать за меня весь проект, он будет выполнять функцию наставника. Ну и иногда чернорабочего (как, например, собрать файл SQL для инициирования БД) для ускорения ручного труда.

Родилась у меня идея сделать симулятор торговли на Московской бирже. Зачем и почему не спрашивайте – это было давно, просто сейчас дозрело. И, как мне кажется, в качестве учебного проекта вполне подойдёт.

После обсуждения с ИИ самой идеи, пришёл к следующей концепции по её реализации: 

Бэкенд

Flask SQLAlchemy

Фронтенд

React + Vite

СУБД

MySQL

Конечно, по дороге ИИ мне наговорил кучу новых слов типа Zustand, Alembic, TanStack, axios. Доверимся ему, и в ходе написания кода будем смотреть, что и с чем едят.

Решения на стороне сервера, в первую очередь, обусловлены имеющейся инфраструктурой виртуального хостинга reg.ru. Использую то, что есть под рукой в доступе. Начну именно отсюда, так как основные ограничения могут встретиться только здесь. Мало ли, что не встанет.

Итак, приступим

Flask

Сам Flask я уже запускал не reg.ru. Если следовать чётко инструкции, то passenger_wsgi.py и файл проекта лежат в корне. Вроде бы нет проблем, но для деплоя у меня используется GitHub Actions, в частности конкретно за загрузку отвечает SamKirkland/FTP-Deploy-Action. А он чистит целевую папку перед аплоадом, и надо прописывать исключения. При помощи бубна (подсказок ИИ) и метода «научного тыка» (ведь не всё, что говорит ИИ, запускается 100% сразу) получилось перенести весь питон в /app. Еще мне не понравилось, что passenger_wsgi.py содержит имя пользователя в открытом виде (у меня ж всё в GitHub уходит), поэтому захотел вынести в .env.

Вот что получилось:

passenger_wsgi.py (лежит в корне)
import sys
import os

def read_env(path):
    if not os.path.exists(path):
        return
    with open(path) as f:
        for line in f:
            line = line.strip()
            if not line or line.startswith('#') or '=' not in line:
                continue
            key, val = line.split('=', 1)
            value = val.strip().strip("'").strip('"')
            os.environ.setdefault(key.strip(), value)
read_env(os.path.join(os.path.dirname(__file__), '.env'))

INTERP = os.getenv('PYTHON_INTERP')
if sys.executable != INTERP:
   os.execl(INTERP, INTERP, *sys.argv)

sys.path.append(os.getcwd())

from app import create_app
application = create_app()

if __name__ == "__main__":
   application.run(host='0.0.0.0')

Кстати, функцию read_env() пришлось заставлять писать ИИ (я совсем пока не крут в python). Но интересно другое: сперва он мне предложил сделать через dotenv, но надо убедиться, что он есть до загрузки моего окружения. Конечно, его нет по умолчанию. Тогда он начал предлагать разные костыли, чтоб не грузить файл в GitHub и сохранить имя пользователя в нём. Пришлось напомнить, что раз .env есть, то можно его и прочитать. Собственно вот.

Окружение .env
PYTHON_INTERP=/flaskenv/bin/python
DB_URL=mysql+mysqldb://dbuser:dbpass@localhost/dbname
JWT_SECRET=SECRET
ALLOWED_ORIGIN=https://HOST.ru

Остальные строки уже на будущее

__init__.py (лежит в /app)
import os
from flask import Flask

def create_app():
    app = Flask(__name__)

    @app.route('/api/ping')
    def ping():
        return {'status': 'ok'}

    return app

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

Кстати, пока ковырялся, подправил скрипт для деплоя, чтобы он всегда закидывал .restart-app (файл нужен для перезапуска Flask через passenger_wsgi).

Всё, Flask на поддомене заработал. Можно приступать к дальнейшим шагам.

Python окружение

Подключился по SSH к серверу, и по совету ИИ, установил следующее в своё окружение.

Запуск окружения
source flaskenv/bin/activate

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

Установка пакетов
pip install flask-sqlalchemy
pip install flask-migrate
pip install flask-jwt-extended
pip install mysqlclient
pip install requests
pip install python-dotenv
pip install bcrypt
pip install marshmallow
pip install flask-cors

Ну и под конец.

Сохраняю requirements.txt
pip freeze > requirements.txt

Единственное, но об этом я подумал уже после, может стоило создать отдельное окружение. Есть совет? Как лучше поступить: иметь одно окружение на все проекты, или для каждого делать отдельно?

MySQL

Ну с MySQL всё намного проще. Во-первых, она уже есть на хостинге, к ней также стоит phpMyAdmin. А, во-вторых, с MySQL я знаком давно и достаточно неплохо, что-то, возможно, и не помню, но это мелочи.

Так как структура уже продумана (с формализацией и нормализацией у меня проблем замечено не было), попросил ИИ сделать скрипт создания таблиц. И, собственно, выполнил его на сервере.

Последние штрихи

После успешного выполнения всего описанного повторил это на локальной машине, с той лишь разницей, что пришлось сделать еще один файлик run.py для локального запуска.

run.py (только локально)
import sys
import os

from app import create_app
application = create_app()

if __name__ == "__main__":
   application.run(host='0.0.0.0')

Залил всё на GitHub. Сделал деплой (по аналогии с прошлым проектом). И… снёс прошлый проект на сервере. Нужно внимательнее делать копипаст, но ничего всё восстановил, переписал. И… вуаля. Теперь всё работает.

Вместо заключения

Выводы какие-то делать ещё рано. Пока только готова инфраструктура для backend-разработки, которая соответствует задуманной концепции. Связь ПК-> GitHub -> сервер выстроена, так что можно писать сам код.

Вот, вроде с виду простенький урок у меня вышел, но занял достаточно времени, и позволил узнать немного нового, а также закрепить некоторые старые знания.

P.S.: Кто знает где найти логи python на shared reg.ru? Всё облазил - не сообразил. Просто, когда python падает приходится не по логам искать, а методом выбрасывания кусков кода.