Framework для python Flask - Отладка

На чтение
12 мин
Дата обновления
22.06.2025
#COURSE#

Для отладки Flask-приложений используйте встроенный отладчик. Включите его, добавив в файл app.py строку app.run(debug=True). Это значительно упростит поиск проблем.

Проблемы с маршрутами: Если приложение не обрабатывает запросы должным образом, проверьте правильность определения маршрутов (@app.route). Проверьте соответствие URL-адресов в маршрутах запросам, которые вы отправляете. Обратите внимание на регистр букв в URL. Использование print() внутри обработчика маршрутов в точках, где вы ожидаете увидеть данные, поможет понять, доходят ли данные туда, куда нужно.

Проверка БД взаимодействий: Если ваше приложение работает с базой данных, внимательно анализируйте запросы к базе данных. Используйте отладчик Python, чтобы детально осмотреть SQL-запросы, выполняемые приложением. Обработка ошибок БД крайне важна, так как от неё зависят ключевые функции.

Анализ форм и входных данных пользователей: Проверяйте корректность входных данных, поступающих от пользователей. Формы Flask предоставляют удобные инструменты для проверки данных, которые приходят от пользователя. Важная рекомендация: проверяйте типы данных, которые пользователь вводит в формы, на соответствие ожидаемому типу.

Проверка обработки ошибок: Включайте обработку исключений (try...except блоки) для предотвращения срывов приложения при возникновении непредвиденных ситуаций. Это существенно упрощает отладку и улучшает пользовательский опыт.

Framework для Python Flask - Отладка

Используйте отладчик pdb. Вставьте точки останова в код с использованием import pdb; pdb.set_trace(). Это позволит вам шаг за шагом проходить исполнение кода, просматривая переменные в реальном времени.

Включите отладку в конфигурации Flask. В файле приложения (например, app.py) настройте режим отладки:

from flask import Flask
app = Flask(__name__)
app.debug = True
# ... ваш код

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

Настройте логгирование. Установите подходящий уровень детализации логгирования для отображения нужной информации о работе приложения. Используйте стандартную библиотеку Python logging.

Проверяйте логи. Проверяйте файлы журналов (например, app.log) для выявления ошибок, предупреждений и других сообщений. Поиск ошибок по логам позволит быстро выявить точку сбоя и понять природу проблемы.

Используйте инструменты для анализа ошибок. Сервисы вроде Sentry.io - помогают в анализе и отслеживании ошибок, приходящих из реальной работы приложения. Это удобный инструмент для больших проектов.

Проверяйте HTTP-заголовки и ответы. Проверяйте заголовки HTTP-ответов, чтобы убедиться, что приложение корректно обрабатывает запросы и возвращает правильные данные.

Единичные тесты. Используйте инструменты для написания юнит-тестов, чтобы проверить отдельные компоненты приложения, изолировав их, и избежать ошибок в дальнейшем.

Установка и настройка отладчика

Для отладки приложений Flask используйте отладчик pdb (Python Debugger).

  • Установка: pdb входит в стандартный набор Python, не требует отдельной установки.
  • Запуск в терминале: Запустите приложение Flask, а затем в терминале введите в командной строке:
    1. python -m pdb your_script.py (если запускаете скрипт напрямую)
    2. python -m flask run --app=your_app (если запускаете Flask сервер).
    3. Затем, когда достигается точка останова, вы можете использовать команды pdb:
      • n - следующая строка кода
      • s - заход в функцию/метод
      • c - продолжить выполнение до следующей точки останова или конца
      • q - выход из отладчика
  • Установка точки останова: в коде добавьте import pdb; pdb.set_trace() в нужной строке.
  • Запуская из IDE: Используйте отладчик, встроенный в вашу IDE (например, PyCharm, VS Code), для более удобной работы. Он предложит настроить точки останова, просматривать переменные, и т.д.
  • Примеры точек останова для Flask:
    • В методах обработчиков запросов (@app.route(...)).
    • В функциях, где обрабатывается бизнес-логика.

Отладка ошибок в коде

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

Для сложных ошибок анализируйте сообщения об ошибках. Внимательно изучите стеки вызовов (traceback). Ищите конкретные ошибки, например, TypeError, ValueError, NameError. Они указывают на проблему в вашем коде.

Проверяйте типы данных. Несоответствие типов часто приводит к ошибкам. Убедитесь, что вы передаёте в функции аргументы правильного типа.

Тестируйте отдельные части кода. Разбейте сложный код на отдельные функции и модули, и тестируйте их по отдельности. Это поможет изолировать источник ошибки и быстрее её локализовать.

Проверяйте ввод данных. Убедитесь, что данные, полученные от пользователя или из внешних источников, имеют корректный формат и тип. Обрабатывайте потенциальные исключения.

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

Отладка проблем с базами данных

Проверяйте логи базы данных. В логах могут содержаться ошибки подключения, запросов или конфликты транзакций. Обратите внимание на время выполнения запросов. Запросы, занимающие много времени, часто указывают на проблемные места в запросах или индексах.

Проблема Решение
Ошибка подключения Проверьте настройки соединения (IP, порт, пользователь, пароль). Убедитесь в доступности сервера базы данных.
Ошибка запроса Проверьте синтаксис SQL-запросов, типов данных, значения параметров запроса и убедитесь в корректности таблиц. Используйте отладчик, чтобы найти ошибку в запросе.
Проблемы с индексами Проанализируйте используемые индексы. Добавьте индексы к столбцам, по которым часто выполняется сортировка или фильтрация. Удалите неиспользуемые индексы.
Конфликты транзакций Исследуйте, какие операции конфликтуют. Реорганизуйте последовательность операций, возможно, используя блокировки. Если транзакции слишком длинные, разбейте их на более мелкие. Оптимизируйте взаимодействие с БД.
Длинные запросы Проверьте структуру запросов (недостающие индексы, слишком сложные условия, неэффективные joins). Проследите, какие операции замедлили работу. Попробуйте оптимизировать сложные запросы, используя joins и подзапросы.

Используйте инструменты отладки Flask. Flask-скрипты, связанные с базой данных, часто содержат отладку отладчика. Обязательно смотрите запросы SQL, выполняемые базой данных.

Отладка проблем с HTTP запросами и ответами

Проверяйте статус коды HTTP ответов. Код 200 означает успех, 404 - ошибку "не найдено", а 500 - внутреннюю ошибку сервера. Используйте инструменты для анализа HTTP запросов и ответов, такие как браузерные разработчики или Python библиотеки (например, requests). Проверяйте заголовки, содержащие ответы, и, при необходимости, протоколируйте весь обмен в логах. Если вы получаете ошибку 400 (Bad Request), детально изучите тело ошибки. В запросах проверьте правильность URL, параметров, заголовков (Authorization, Content-Type). В запросах с JSON данными убедитесь, что данные корректны и соответствуют формату.

Изучайте ошибки в логах Python приложения. Если приложение Flask использует logging, найдите ошибки, связанные с отправкой или приёмом запросов и ответами.

Проверяйте корректность данных в запросах. В запросах используйте дебаггер Pycharm или pdb, чтобы посмотреть на состояние данных перед отправкой запроса. В случае проблем с JSON, используйте библиотеку `json` для проверки корректности структуры.

Отладка с использованием инструментов для тестирования

Используйте модуль unittest для автоматического тестирования функций Flask. Создавайте отдельные тестовые классы для разных аспектов приложения. Пример:

import unittest from flask import Flask from flask import render_template app = Flask(__name__) @app.route("/") def index(): return render_template("index.html", message="Привет!") class FlaskTest(unittest.TestCase): def test_index_page(self): with app.test_client() as client: response = client.get("/") self.assertEqual(response.status_code, 200) self.assertIn(b"Привет!", response.data) self.assertIn(b"", response.data) def test_404(self): with app.test_client() as client: response = client.get("/nonexistent") self.assertEqual(response.status_code, 404) if __name__ == '__main__': unittest.main() </code></p> <p>Этот код тестирует маршрут <code>/</code>. Проверяет статус ответа (200), наличие текста "Привет!" и тега <code>title</code> в ответе. Важно: добавляйте тесты для всех возможных сценариев, включая ошибки (например, <code>test_404</code>). Это позволит обнаружить неожиданное поведение приложения на ранних стадиях разработки.</p> <p>Для более сложных тестов используйте <code>FlaskClient</code>. Он позволяет симулировать различные запросы (GET, POST) и проверять различные аспекты ответа, такие как заголовки, cookie.</p> <p><code>unittest2</code> - удобная альтернатива. Работает со стандартными методами утверждений pytest. Установите с помощью pip:</p> <p><code>pip install unittest2 </code></p> <p>Эти инструменты позволят выявить ошибки в логике или структуре вашего приложения, прежде чем они повлияют на конечного пользователя. Подход к тестированию – ключ к качеству приложения.</p> <h2>Отладка в многопоточной и многопроцессной средах</h2> <p>Ключ к успешной отладке - детальная информация о потоках/процессах. Используйте инструменты вроде <code>threading</code> или <code>multiprocessing</code> и <code>pdb</code> (Python Debugger). Запустите приложение в режиме отладки, добавив отладочные точки (<code>breakpoint()</code>) в критических местах кода (например, перед выполнением операций, вызывающих проблемы).</p> <p>Важно отслеживать состояния переменных в разных потоках или процессах. Используйте механизмы дебаггера, чтобы увидеть, какие значения имеют переменные в конкретный момент выполнения. Посмотрите, как меняются переменные в течение работы потоков или процессов. Рассмотрите использование <code>logging</code> для записи информации о текущем состоянии.</p> <p>Если ошибка связана с конкуренцией за ресурсы, используйте инструменты, которые показывают, как программы работают в параллели. Проанализируйте блокировки в многопоточной среде. Установите отладку на ключевых секциях кода, которые могут быть источником конфликтов.</p> <p>Для многопроцессной среды, убедитесь в корректной обработке межпроцессорного взаимодействия и обмена данными между процессами. Посмотрите на ID процессов и механизмы синхронизации (например, очереди) для понимания, как процессы взаимодействуют.</p> <p>При отладке в многопоточных или многопроцессных приложениях, важно использовать идентификаторы потоков или процессов. Отслеживание потоков и их состояния может выявить ошибки. Мониторинг памяти поможет обнаружить утечки. Оцените потребление процессорного времени разными процессами.</p> <h2>Вопрос-ответ:</h2> <h4>Как эффективно отлаживать Flask приложения с большим количеством маршрутов и сложной логикой?</h4> <p>Отладка Flask-приложений с множеством маршрутов и запутанной логики требует системного подхода. Ключевым моментом является поэтапное тестирование. Разбейте приложение на небольшие, независимые компоненты. Используйте отладку по частям, проверяя работу каждого маршрута с минимально необходимыми данными. Важно применять print-выводы или logging для отслеживания состояния переменных и потоков выполнения. Если проблема связана с базами данных, используйте методы отслеживания транзакций. Также полезно использовать инструменты вроде pdb (Python Debugger), позволяющие настраивать точки останова и шаг за шагом прослеживать выполняемый код. Не пренебрегайте просмотр ошибок в консоли и журналах веб-сервера.</p> <h4>Какие инструменты для отладки Flask-приложений вы бы порекомендовали помимо стандартных методов (например, print)?</h4> <p>Помимо стандартных print-выводов, для отладки Flask-приложений полезны инструменты вроде pdb (Python Debugger). Он позволяет устанавливать точки останова и шаг за шагом следить за выполнением кода, выводя значения переменных. Встроенные средства logging Python позволяют регистрировать события и ошибки с разными уровнями детализации. Для работы с базами данных могут понадобиться инструменты, отслеживающие запросы и состояние данных. Если приложение имеет фронтенд, хороший выбор - инструменты для отладки JavaScript, такие как Chrome DevTools. И наконец, существуют специализированные веб-серверы, которые позволяют видеть все запросы и ответы в реальном времени, что помогает выявлять проблемы на уровне взаимодействия с сервером.</p> <h4>Как использовать logging для отслеживания и анализа ошибок в Flask приложениях, особенно в условиях высокой нагрузки?</h4> <p>Использование logging в Flask-приложениях позволяет создавать подробные журналы событий и ошибок. Настройте отдельный уровень logging для разных частей приложения. В настройках logging можно настроить, какие данные записываются в файлы, а какие передаются в консоль. Рекомендуется использовать различные уровни логгирования (DEBUG, INFO, WARNING, ERROR, CRITICAL), чтобы выводить информацию разной важности. При высокой нагрузке важно настроить правильный уровень детализации логгинга. Чтобы в логах было проще ориентироваться, структурируйте логирующие сообщения, добавляя в них информацию о времени, запрос и значения параметров. Отдельный log-файл для ошибок повысит эффективность анализа проблем.</p> <h4>Есть ли рекомендации по организации отладки Flask-приложений, работающих с базами данных, где возникают ошибки целостности данных?</h4> <p>При работе с базами данных ключевым моментом является отслеживание транзакций. Выделяйте отдельные блоки кода для операций с БД, используя try...except блоки для обработки возможных ошибок. Внутри блоков try можно записывать в лог информацию о запросах к базе данных и полученных результатах. В случае возникновения ошибок следует записывать контекст ошибки - тип ошибки, сообщение, SQL-запрос, который вызвал проблему. Обязательно проверяйте правильность данных, передаваемых в базу. Используйте валидацию данных перед их отправкой в базу. Это поможет предотвратить ошибки целостности данных и упростит диагностику проблем.</p> <h4>Как отлаживать проблемы с подключением к базе данных в Flask приложениях?</h4> <p>Проблемы с подключением к базе данных часто проявляются в виде исключений. В первую очередь, проверьте наличие подключений и корректность настроек базы данных. Обратите внимание на правильность параметров соединения (пользователь, пароль, хост, порт, имя базы данных). Обрабатывайте исключения, связанные с подключением, логгируя их подробно. Проверьте доступность сервера и подключение к сети. Посмотрите, нет ли проблем с firewall'ом. Если проблема повторяется, можно воспользоваться средствами мониторинга, отслеживающие соединения и запросы к базе данных. При возникающих проблемах, обязательно проверяйте документацию используемой СУБД.</p> #INNER#<div class="article-footer"><div class="tags"><a href="/blog/python-i-programmirovanie/">Python и программирование</a></div><div class="blog-share"><span>Поделиться:</span><a href="https://vk.com/share.php?url=https%3A%2F%2Fuchilegko.info%2Fblog%2Fpython-i-programmirovanie%2Fframework-dlya-python-flask-otladka%2F&title=Framework%20%D0%B4%D0%BB%D1%8F%20python%20Flask%20-%20%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0&utm_source=share2" rel="nofollow noopener" target="_blank"><i class="fab fa-vk"></i></a><a href="https://t.me/share/url?url=https%3A%2F%2Fuchilegko.info%2Fblog%2Fpython-i-programmirovanie%2Fframework-dlya-python-flask-otladka%2F&text=Framework%20%D0%B4%D0%BB%D1%8F%20python%20Flask%20-%20%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0&utm_source=share2" rel="nofollow noopener" target="_blank"><i class="fab fa-telegram"></i></a><a href="viber://forward?text=Framework%20%D0%B4%D0%BB%D1%8F%20python%20Flask%20-%20%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0%20https%3A%2F%2Fuchilegko.info%2Fblog%2Fpython-i-programmirovanie%2Fframework-dlya-python-flask-otladka%2F&utm_source=share2" rel="nofollow" target="_blank"><i class="fab fa-viber"></i></a><a href="https://api.whatsapp.com/send?text=Framework%20%D0%B4%D0%BB%D1%8F%20python%20Flask%20-%20%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0%20https%3A%2F%2Fuchilegko.info%2Fblog%2Fpython-i-programmirovanie%2Fframework-dlya-python-flask-otladka%2F&utm_source=share2" rel="nofollow noopener" target="_blank"><i class="fab fa-whatsapp"></i></a></div></div></div></div><div class="pane related-posts"><h4 class="decored-title">Похожие статьи</h4><div class="row"><div class="col-lg-4 mb-4 mb-lg-0"><div class="post-preview"><div class="post-preview-cover"><a href="/blog/python-i-programmirovanie/django-contrib-humanize-django-python/"><img src="/upload/iblock/9a2/waeg3r5grnysxyot2pg8ykib8rt9e33a/django_contrib_postgres_django_python.png"></a></div><div class="post-preview-title"><a href="/blog/python-i-programmirovanie/django-contrib-humanize-django-python/">Framework для python Flask - Отладка</a></div><span>22.06.2025</span></div></div><div class="col-lg-4 mb-4 mb-lg-0"><div class="post-preview"><div class="post-preview-cover"><a href="/blog/python-i-programmirovanie/framework-dlya-python-flask-testirovanie-prilozheniy-flask/"><img src="/upload/iblock/1c3/qv4at92ssv8a7pqhk83ffaem9slkmu7l/framework_dlya_python_flask_testovyy_ohvat.png"></a></div><div class="post-preview-title"><a href="/blog/python-i-programmirovanie/framework-dlya-python-flask-testirovanie-prilozheniy-flask/">Framework для python Flask - Отладка</a></div><span>22.06.2025</span></div></div><div class="col-lg-4 mb-4 mb-lg-0"><div class="post-preview"><div class="post-preview-cover"><a href="/blog/python-i-programmirovanie/framework-dlya-python-flask-testy-zavisyashchie-ot-aktivnogo-konteksta/"><img src="/upload/iblock/8d6/03uy3r3s1d4saumhx1uogpoj20pjlpk4/framework_dlya_python_flask_upravlenie_avtoekranirovaniem.png"></a></div><div class="post-preview-title"><a href="/blog/python-i-programmirovanie/framework-dlya-python-flask-testy-zavisyashchie-ot-aktivnogo-konteksta/">Framework для python Flask - Отладка</a></div><span>22.06.2025</span></div></div></div></div></div><div class="sidebar"><div class="widget"><h3>Популярные статьи</h3><div class="wiget-grp"><div class="post-tmb"><div class="post-tmb-img"><img src="/upload/iblock/164/j04yralgn5zqosbv7w38aubfqln3wyco/yung_pomozhet_razbiraemsya_v_arhetipah_personazhey.png"/></div><div class="post-tmb-cnt"><div class="post-tmb-title"><a href="/blog/psikhologiya/yung-pomozhet-razbiraemsya-v-arkhetipakh-personazhey/">Юнг поможет - разбираемся в архетипах персонажей</a></div><div class="post-tmb-title">22 июня 2025 г.</div></div></div><div class="post-tmb"><div class="post-tmb-img"><img src="/upload/iblock/860/ohuumodvcehg3l38s5b81w4oldcj34zp/chto_takoe_photon_engine_obzor_dvizhka_dlya_sozdaniya_multipleernyh_igr.png"/></div><div class="post-tmb-cnt"><div class="post-tmb-title"><a href="/blog/unity-i-igrovye-dvizhki/chto-takoe-photon-engine-obzor-dvizhka-dlya-sozdaniya-multipleernykh-igr/">Что такое Photon Engine - обзор движка для создания мультиплеерных игр</a></div><div class="post-tmb-title">22 июня 2025 г.</div></div></div></div></div><div class="widget"><h3>Категории</h3><ul class="cat-nav"><li><a href="/blog/biznes-strategii/">Бизнес-стратегии</a></li><li><a href="/blog/vostrebovannye-professii/">Востребованные профессии</a></li><li><a href="/blog/geymdizayn/">Геймдизайн</a></li><li><a href="/blog/grafika-i-3d-modelirovanie/">Графика и 3D-моделирование</a></li><li><a href="/blog/znaniya/">Знания</a></li><li><a href="/blog/igrovaya-industriya-i-biznes/">Игровая индустрия и бизнес</a></li><li><a href="/blog/igrovaya-kultura-i-teoriya/">Игровая культура и теория</a></li><li><a href="/blog/igrovye-metodiki-v-obuchenii/">Игровые методики в обучении</a></li><li><a href="/blog/igrovye-mekhaniki/">Игровые механики</a></li><li><a href="/blog/igrovye-novosti/">Игровые новости</a></li><li><a href="/blog/igrovye-obzory/">Игровые обзоры</a></li><li><a href="/blog/interaktivnye-formaty/">Интерактивные форматы</a></li><li><a href="/blog/iskusstvennyy-intellekt/">Искусственный интеллект</a></li><li><a href="/blog/istoriya-igr-i-studiy/">История игр и студий</a></li><li><a href="/blog/neyroseti/">Нейросети</a></li><li><a href="/blog/prochee/">Прочее</a></li><li><a href="/blog/psikhologiya/">Психология</a></li><li><a href="/blog/razrabotka-igr/">Разработка игр</a></li><li><a href="/blog/rukovodstva-i-gaydy/">Руководства и гайды</a></li><li><a href="/blog/saund-dizayn-i-muzyka-v-igrakh/">Саунд-дизайн и музыка в играх</a></li><li><a href="/blog/testirovanie-i-optimizatsiya-igr/">Тестирование и оптимизация игр</a></li><li><a href="/blog/tekhnologii-v-igrakh/">Технологии в играх</a></li><li><a href="/blog/finansovye-aspekty-igrovoy-industrii/">Финансовые аспекты игровой индустрии</a></li><li><a href="/blog/blender-i-3d-grafika/">Blender и 3D-графика</a></li><li><a href="/blog/django-i-veb-razrabotka/">Django и веб-разработка</a></li><li><a href="/blog/nft-i-blokcheyn-v-igrakh/">NFT и блокчейн в играх</a></li><li><a href="/blog/python-i-programmirovanie/">Python и программирование</a></li><li><a href="/blog/unity-i-igrovye-dvizhki/">Unity и игровые движки</a></li><li><a href="/blog/vr-i-metavselennye/">VR и метавселенные</a></li></ul></div></div></div></div></main><footer class="footer"><div class="footer-top"><div class="container"><div class="row"><div class="col-12 col-sm-4 col-md-4 col-xl-4"><a class="logo-brand" href="/"><span></span>Учи Легко</a></div><div class="col-6 col-sm-4 col-md-4 col-xl-4"><div class="foot-item"><div class="foot-title">Контакты</div><p>E-mail: <span></span></p></div></div><div class="col-6 col-sm-4 col-md-4 col-xl-4"><div class="foot-item"><div class="foot-title">Общее</div><p></p></div></div></div></div></div><div class="footer-btm"><div class="container"><span>© 2025</span><!-- Yandex.Metrika counter --><script type="text/javascript">(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }} k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(104256611, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true });</script><noscript> <div><img src="https://mc.yandex.ru/watch/104256611" style="position:absolute; left:-9999px;" alt="alt"/></div></noscript><!-- /Yandex.Metrika counter --></div></div></footer><div class="modal modal-wide fade" id="modal-1" tabindex="-1" aria-labelledby="modal-1Label" aria-hidden="true"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><div class="modal-help"><button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button><div class="modal-help-lft"><span>Поможем подобрать курс</span>чтобы вы получили повышение<br>или новую профессию.</div><div class="modal-help-rht"><div class="modal-form-title">Оставьте заявку, и мы перезвоним</div><form action><div class="form-group"><input class="form-control" type="text" placeholder="Имя"></div><div class="form-group"><input class="form-control" type="tel" placeholder="Телефон"></div><div class="form-group"><input class="form-control" type="email" placeholder="Email"></div><div class="form-check mb-4"><input class="form-check-input" id="agree" type="checkbox"><label class="form-check-label" for="agree">Я соглашаюсь на <a href="#">обработку персональных данных</a></label></div><button class="btn btn-primary btn-full" type="button">Оставить заявку</button></form></div></div></div></div></div><div class="modal modal-simple fade" id="modal-2" tabindex="-1" aria-labelledby="modal-2Label" aria-hidden="true"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><button class="btn-close" type="button" data-bs-dismiss="modal" aria-label="Close"></button><div class="modal-title">Узнайте какая профессия вам подходит</div><p class="text-center">Пройдите тест - это займет не больше 10 минут</p><form action><div class="form-group"><input class="form-control" type="text" placeholder="Имя"></div><div class="form-group"><input class="form-control" type="email" placeholder="Email"></div><div class="form-check mb-4"><input class="form-check-input" id="agree1" type="checkbox"><label class="form-check-label" for="agree1">Я соглашаюсь на <a href="#">обработку персональных данных</a></label></div><button class="btn btn-primary btn-full" type="button">Пройти тест</button></form></div></div></div><svg width="0" height="0" style="display: none;"><symbol id="prev" viewBox="0 0 24 24" fill="none"><path d="M15 6L9 12L15 18" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></symbol><symbol id="next" viewBox="0 0 24 24" fill="none"><path d="M9 6L15 12L9 18" stroke="#fff" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"></path></symbol></svg><script src="/js/jquery.min.js"></script><script src="/js/bootstrap.bundle.min.js"></script><script src="/js/slick.min.js"></script><script src="/js/init.js"></script></body></html>