Aiohttp python что это

от admin

Пишем первое приложение на aiohttp: подготовка и запуск.

Привет! Меня зовут Артём, я работаю backend-разработчиком в KTS Studio. Недавно я вел лекцию в бесплатной школе python-разработки, дважды в год проходящей в нашей компании, и, в процессе подготовки материалов, получилась эта статья. Она рассчитана на студентов, которые прошли отбор на наши курсы, то есть на людей, которые уже имели небольшой опыт веб-разработки и умеют создавать на Python’е несложные программы. Приятного чтения!

Скорее всего мало кого удивит тот факт, что на Python’е можно написать свое веб-приложение. Такие слова как Flask и Django слышал почти каждый программист, хоть как-то связанный с Python или веб-программированием вообще. Эти фреймворки популярны, просты и достаточно производительны для большинства задач, возникающих при написании API или даже полноценного веб-приложения. Что же такое aiohttp и зачем нужен еще один веб-фреймворк на Python?

Как сказано в официальной документации:

Aiohttp — ассинхронный HTTP клиент и сервер, созданный для asyncio и Python

В чем же его преимущества перед более классическими Django и Flask? Одно из ключевых преимуществ указано в определении — он создан для asyncio, библиотеки для написания асинхронного кода на Python, в то время, как код на Django и Flask (традиционно) исполняется синхронно. То есть, веб-приложение на aiohttp в теории, а бенчмарки производительности лишь подтверждают эту теорию, может быть в несколько раз эффективнее такого же по функциональности приложения на Django или Flask.

Aiohttp позволяет создавать сложные веб-приложения, и, если судить по моему личному опыту, не уступает им по скорости разработки. Хорошая документация, примеры в сети и это руководство позволят быстро написать качественный и, что не менее важно, производительный сервис. Aiohttp в разработке используют такие компании как Yandex, Wargaming, Rambler и Skyscanner.

В конце каждой статьи будет ссылка на исходный код на github’е. В репозитории также хранится папка с необходимыми зависимостями venv/. Хранение зависимостей в репозитории в большинстве случаев неправильно, но в данном случае это сделано для немедленного запуска приложения. Если вы будете запускать приложение, скачанное из репозитория, не забудьте активировать виртуальное окружение командой source venv/bin/activate , выполненной в терминале из корня проекта.

Сегодня мы напишем небольшое веб-приложение на aiohttp — стену с отзывами, где каждый может оставить свое мнение о каком-то продукте. В процессе мы создадим расширяемую архитектуру веб-приложения на aiohttp, а также рассмотрим такие темы как:

  • Архитектура веб-приложения
  • Асинхронная работа с базой данных и автоматические миграции
  • Работа с HTML-шаблонами с помощью Jinja2
  • Размещение нашего приложения в Интернете с помощью сервиса Heroku

А также сигналы, обработку ошибок, работу с Docker’ом и многое другое.

Подготовка

Все команды в статье были выполнены в операционной системе OSX, но также должны работать в любой *NIX системе, например в Linux Ubuntu.

Во время разработки я буду использовать Python 3.7.

Давайте создадим папку aiohttp_server, которая в дальнейшем будет называться корень проекта, и в ней создадим текстовый файл requirements.txt, в который запишем необходимые зависимости:

Сохранив файл, откроем терминал и перейдем в нашу папку, чтобы скачать все необходимые зависимости:

После предпоследней команды в начале строки терминала должна появится надпись (venv) — это означает что виртуальное окружение успешно активировано. Дожидаемся загрузки всех модулей и идем дальше.

Первый запуск

Создадим в папке aiohttp_server следующую структуру:

Теперь откроем файл main.py и добавим в него следующее:

Зайдем в файл views.py в папке app/forum и напишем:

Только что мы создали функциональный View. Определение “функциональный” означает, что код оформлен в виде функции, а не в виде класса (в следующей части мы коснемся и class-based View).

Рассмотрим написанную функцию более детально.

Функция обернута в декоратор @aiohttp_jinja2.template("index.html") — этот декоратор передает возвращенное функцией значение в шаблонизатор Jinja2, а затем возвращает сгенерированную шаблонизатором html-страницу как http-ответ. В данном случае возвращенным значением является словарь, значения которого подставляются в html-файл index.html .

Отдельно стоит заметить, что объект запроса request передается как аргумент функции index . Мы не используем request в этой функции, но будем использовать в дальнейшем.

View — это некий вызываемый объект, который принимает на вход объект HTTP-запроса — Request и возвращает на пришедший запрос HTTP-ответ — Response.

Http-запрос содержит полезную информацию, например url, на который пришел запрос, данные, которые передал пользователь, а также контекст запроса. В контексте запроса содержатся данные, которые мы или aiohttp добавили к этому запросу. Например, мы предварительно авторизовали пользователя — чтобы повторно не проверять авторизацию пользователя из базы во всех View и не дублировать код, мы можем добавить объект пользователя в контекст запроса. Тогда мы сможем получить нашего пользователя во View примерно таким образом request['user'] , использовав хранилище запроса.

HTTP-ответ включает в себя полезную нагрузку, например json-данные, заголовки и статус ответа. В простейшем View, который мы только что написали, всю работу по формированию Http-ответа выполняет декоратор @aiohttp_jinja2.template("index.html") . Он получает данные из нашего View, которые мы возвращаем в виде словаря, находит шаблон index.html (о шаблонах написано ниже), подставляет туда данные из этого словаря, преобразует шаблон в html-текст и передает его в ответ на запрос. Браузер воспринимает html и показывает страницу с нашим контентом.

В файл routes.py необходимо добавить следующий код:

Route — это звено, связывающее адрес, по которому был отправлен запрос и код View, в котором этот запрос будет обработан. То есть если пользователь перейдет на корень нашего сайта (по адресу /), то объект запроса будет передан в View index и оттуда же будет возвращен ответ. Подробней про Route можно прочитать тут.

Осталось только добавить в templates/index.html код для визуального представления нашей страницы, его можно найти по этой ссылке.

Template — это некий html-код, в который можно подставить данные, полученные в результате обработки запроса. В данном случае, в коде View мы отдаем словарь с ключом title, фрейморк Jinja2 ищет в указанном html-шаблоне строки <> и заменяет их на значение из словаря по данному ключу. Это простейший пример, шаблоны позволяют делать намного больше: выполнять операции ветвления, циклы, а также множество встроенных функций, например простейшее суммирование. Примеры использования можно посмотреть в документации jinja2.</p> <p>Мы создали первую версию нашего приложения! Осталось запустить его следующей командой в терминале (убедитесь, что находитесь в папке <em>aiohttp_server</em>):</p> <p>Вы должны увидеть следующий текст:</p> <p>Давайте теперь наконец-то посмотрим результаты нашей работы, для этого в браузере напишем в адресной строке http://0.0.0.0:8080 и нажмем Enter. Вы должны увидеть первую версию нашего приложения. При клике на кнопку “Отправить” должно возникнуть сообщение о том, что отзыв отправлен.</p> <p><strong>Поздравляю! Вы успешно создали первое приложение на aiohttp!</strong></p> <h2>Резюме</h2> <p>Подведем итоги этой статьи:</p> <ul> <li>Настроили виртуальное python-окружение</li> <li>Создали базовую структуру проекта</li> <li>Написали первый View</li> <li>Поработали с Jinja2-шаблонами</li> <li>Провели первый запуск приложения</li> </ul> <p>В следующей статье мы рассмотрим работу с базой данных и узнаем что такое миграции и как с ними удобнее работать в проектах с aiohttp.</p> <h2>Name already in use</h2> <p>If nothing happens, download GitHub Desktop and try again.</p> <h5>Launching GitHub Desktop</h5> <p>If nothing happens, download GitHub Desktop and try again.</p> <h5>Launching Xcode</h5> <p>If nothing happens, download Xcode and try again.</p> <h5>Launching Visual Studio Code</h5> <p>Your codespace will open once ready.</p> <p>There was a problem preparing your codespace, please try again.</p> <h3>Latest commit</h3> <h3>Git stats</h3> <h3>Files</h3> <p>Failed to load latest commit information.</p> <h3>README.rst </h3> <p>Async http client/server framework</h2> </p> <ul> <li>Supports both client and server side of HTTP protocol.</li> <li>Supports both client and server Web-Sockets out-of-the-box and avoids Callback Hell.</li> <li>Provides Web-server with middlewares and plugable routing.</li> </ul> <p>To get something from the web:</p> <p>An example using a simple server:</p> <p>Feel free to make a Pull Request for adding your link to these pages!</p> <p>We support Stack Overflow. Please add <em>aiohttp</em> tag to your question there.</p> <p>Optionally you may install the cChardet and aiodns libraries (highly recommended for sake of speed).</p> <h2>Первые шаги в aiohttp</h2> <p></p> <p>Привет, меня зовут Артём. Я работаю бэкендером в <u>KTS</u> и веду курсы по разработке в KTS Metaclass. Заметил, что труднее всего студентам даются темы по асинхронному программированию.</p> <p>Основываясь на своём преподавательском опыте, я написал туториал, рассказывающий о создании базового aiohttp-сервиса с нуля и затрагивающий самые сложные для студентов вопросы: как сделать асинхронное python-приложение, как работать с базой данных и как разложить свой проект в интернете.</p> <p>В цикле статей мы рассмотрим следующие темы:</p> <div style="clear:both; margin-top:0em; margin-bottom:1em;"><a href="https://gshimki.ru/tehnologija/39/intel-r-computing-improvement-program-chto-jeto-za" target="_blank" rel="dofollow" class="uad8a33309ae2f6a9e79b116137b52775"><!-- INLINE RELATED POSTS 1/1 //--><style> .uad8a33309ae2f6a9e79b116137b52775 , .uad8a33309ae2f6a9e79b116137b52775 .postImageUrl , .uad8a33309ae2f6a9e79b116137b52775 .imgUrl , .uad8a33309ae2f6a9e79b116137b52775 .centered-text-area { min-height: 100px; position: relative; } .uad8a33309ae2f6a9e79b116137b52775 , .uad8a33309ae2f6a9e79b116137b52775:hover , .uad8a33309ae2f6a9e79b116137b52775:visited , .uad8a33309ae2f6a9e79b116137b52775:active { border:0!important; } .uad8a33309ae2f6a9e79b116137b52775 { display: block; transition: background-color 250ms; webkit-transition: background-color 250ms; width: 100%; opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; background-color: #eaeaea; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.17); -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.17); -o-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.17); -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.17); } .uad8a33309ae2f6a9e79b116137b52775:active , .uad8a33309ae2f6a9e79b116137b52775:hover { opacity: 1; transition: opacity 250ms; webkit-transition: opacity 250ms; background-color: #FFFFFF; } .uad8a33309ae2f6a9e79b116137b52775 .postImageUrl , .uad8a33309ae2f6a9e79b116137b52775 .imgUrl { background-position: center; background-size: cover; float: left; margin: 0; padding: 0; } .uad8a33309ae2f6a9e79b116137b52775 .postImageUrl { width: 30%; } .uad8a33309ae2f6a9e79b116137b52775 .imgUrl { width: 100%; } .uad8a33309ae2f6a9e79b116137b52775 .centered-text-area { float: right; width: 70%; padding:0; margin:0; } .uad8a33309ae2f6a9e79b116137b52775 .centered-text { display: table; height: 100px; left: 0; top: 0; padding:0; margin:0; } .uad8a33309ae2f6a9e79b116137b52775 .uad8a33309ae2f6a9e79b116137b52775-content { display: table-cell; margin: 0; padding: 0 10px 0 10px; position: relative; vertical-align: middle; width: 100%; } .uad8a33309ae2f6a9e79b116137b52775 .ctaText { border-bottom: 0 solid #fff; color: #34495E; font-size: 13px; font-weight: bold; letter-spacing: .125em; margin: 0; padding: 0; text-decoration: underline; } .uad8a33309ae2f6a9e79b116137b52775 .postTitle { color: #000000; font-size: 16px; font-weight: 600; margin: 0; padding: 0; } .uad8a33309ae2f6a9e79b116137b52775 .ctaButton { background-color: #FFFFFF; margin-left: 10px; position: absolute; right: 0; top: 0; } .uad8a33309ae2f6a9e79b116137b52775:hover .imgUrl { -webkit-transform: scale(1.2); -moz-transform: scale(1.2); -o-transform: scale(1.2); -ms-transform: scale(1.2); transform: scale(1.2); } .uad8a33309ae2f6a9e79b116137b52775 .imgUrl { -webkit-transition: -webkit-transform 0.4s ease-in-out; -moz-transition: -moz-transform 0.4s ease-in-out; -o-transition: -o-transform 0.4s ease-in-out; -ms-transition: -ms-transform 0.4s ease-in-out; transition: transform 0.4s ease-in-out; } .uad8a33309ae2f6a9e79b116137b52775:after { content: ""; display: block; clear: both; } </style><div class="postImageUrl" style="overflow:hidden; z-index: 10; max-width: 100%;"><div class="imgUrl" style="background-image:url();"></div></div><div class="centered-text-area"><div class="centered-text"><div class="uad8a33309ae2f6a9e79b116137b52775-content"><div class="ctaText" style="float:left;">Читать:</div><div class="clear:both;"></div><div class="postTitle" style="float:left;">Intel r computing improvement program что это за программа</div></div></div></div></a></div><p>Асинхронная работа с базой данных и автоматические миграции</p> <p>Работа с HTML-шаблонами с помощью <em>Jinja2</em></p> <p>Размещение нашего приложения в Интернете с помощью сервиса <em>Heroku</em></p> <p>А также сигналы, обработку ошибок, работу с <em>Docker</em> и многое другое.</p> <p>Эта статья – первая из трех, и ее цель — помочь начинающим aiohttp-программистам написать первое “hello-world” приложение.</p> <p>В этой статье мы напишем небольшое веб-приложение на aiohttp — стену с отзывами, где пользователь может оставить мнение о продукте.</p> <p> <img decoding="async" src="https://habrastorage.org/getpro/habr/upload_files/5d4/b70/8bb/5d4b708bb68dbc8e4d21948fe6c527b1.png" /></p> <p>Мы пройдем по шагам:</p> <h3>Создание проекта</h3> <p>Все команды в статье были выполнены в операционной системе OSX, но также должны работать в любой *NIX системе, например в Linux Ubuntu. Во время разработки я буду использовать Python 3.7.</p> <p>Давайте создадим папку <em>aiohttp_server,</em> которая в дальнейшем будет называться корнем проекта<em>.</em> В ней создадим текстовый файл <em>requirements.txt,</em> который будет содержать все необходимые для работы приложения зависимости и их версии. Запишем в него следующие модули:</p> <p>Создадим виртуальное окружение – что-то вроде песочницы, которое содержит приложение со своими библиотеками, обновление и изменение которых не затронет другие приложение, и установим в него наши зависимости:</p> <p>После этого в начале строки терминала должна появится надпись (venv) — это означает что виртуальное окружение успешно активировано. Установим необходимые модули:</p> <h3>Структура проекта</h3> <p>Создадим в папке <em>aiohttp_server</em> следующую структуру:</p> <p>Теперь откроем файл main.py и добавим в него следующее:</p> <p>После предварительной настройки можно создать первый View.</p> <h3>Первый View</h3> <p>View — это некий вызываемый объект, который принимает на вход HTTP-запрос — R<em>equest</em> и возвращает на пришедший запрос HTTP-ответ — <em>Response.</em></p> <p>Http-запрос содержит полезную информацию, например url запроса и его контекст, переданные пользователем данные и многое другое. В контексте запроса содержатся данные, которые мы или aiohttp добавили к этому запросу. Например, мы предварительно авторизовали пользователя — чтобы повторно не проверять авторизацию пользователя из базы во всех View и не дублировать код, мы можем добавить объект пользователя в контекст запроса. Тогда мы сможем получить нашего пользователя во View, например, так: request[‘user’].</p> <p>HTTP-ответ включает в себя полезную нагрузку, например, данные в json, заголовки и статус ответа. В простейшем View, который из примера выше, всю работу по формированию HTTP-ответа выполняет декоратор @aiohttp_jinja2.template(«index.html») . Декоратор получает данные из View, которые возвращаются в виде словаря, находит шаблон index.html (о шаблонах написано ниже), подставляет туда данные из этого словаря, преобразует шаблон в html-текст и передает его в ответ на запрос. Браузер парсит html и показывает страницу с нашим контентом.</p> <p>В файле <em>views.py</em> в папке <em>app/forum</em> напишем следующий код:</p> <p>Здесь создается функциональный View (function-based View). Определение “функциональный” означает, что код оформлен в виде функции, а не классом (в следующей части мы коснемся и class-based View).</p> <p>Рассмотрим написанную функцию детальнее: функция обернута в декоратор <em>@aiohttp_jinja2.template(«index.html»)</em> — этот декоратор передает возвращенное функцией значение в шаблонизатор <em>Jinja2</em>, а затем возвращает сгенерированную шаблонизатором html-страницу как http-ответ. В данном случае возвращенным значением будет словарь, значения которого подставляются в html-файл index.html.</p> <p>Отдельно стоит заметить, что объект запроса request передается как аргумент функции index. Мы не используем request в этой функции, но будем использовать в дальнейшем.</p> <p>HTTP-запрос отправляется на конкретный url-адрес. Для передачи HTTP-запроса в нужный View необходимо задать эту связь в приложении с помощью Route.</p> <h3>Первый Route</h3> <p>Route — это звено, связывающее адрес, по которому был отправлен запрос и код View, в котором этот запрос будет обработан. То есть, если пользователь перейдет в корень нашего сайта (по адресу /), то объект запроса будет передан в View index и оттуда же будет возвращен ответ. Подробней про Route можно прочитать тут.</p> <p>В файл <em>routes.py</em> необходимо добавить следующий код:</p> <h3>Первый Template</h3> <p>Теперь нам осталось только добавить в <em>templates/index.html</em> код верстку нашей страницы. Его можно найти <u>по этой ссылке.</u></p> <p><em>Template</em> — это html-шаблон, в который подставляются данные, полученные в результате обработки запроса. В примере в коде View отдается словарь с ключом title, шаблонизатор <em>Jinja2</em> ищет в указанном html-шаблоне строки <em><<title>></em> и заменяет их на значение из словаря по данному ключу. Это простейший пример, шаблоны позволяют делать намного больше: выполнять операции ветвления, циклы и другие операции, например, суммирование. Примеры использования можно посмотреть в документации jinja2.</p> <h3>Запуск приложения</h3> <p>Мы создали первую версию нашего приложения! Осталось запустить его следующей командой в терминале (убедитесь, что находитесь в папке <em>aiohttp_server</em>):</p> <p>Вы должны увидеть следующий текст в консоли. Он означает, что сервер запущен на порту 8080.</p> <p>Давайте теперь посмотрим результаты нашей работы! Для этого перейдите по адресу http://0.0.0.0:8080 в браузере. Вы должны увидеть первую версию нашего приложения. При клике на кнопку “Отправить” должно возникнуть сообщение о том, что отзыв отправлен.</p> <p> <img decoding="async" src="https://habrastorage.org/getpro/habr/upload_files/700/4d6/328/7004d63281ad766bbf6c4b16c5d32fcb.png" /></p> <p>Поздравляю! Вы успешно создали первое приложение на aiohttp!</p> <h3>Заключение</h3> <p>В статье рассмотрено создание простого приложения на aiohttp, которое принимает запрос пользователя и отдает html-страницу. Мы затронули:</p> <p>Настройку виртуального окружения</p> <p>Базовую настройку проекта на aiohttp</p> <p>Наше приложение представляет собой простой веб-сервер, отдающий html-страницу по запросу — в нем нет никакого взаимодействия с базами данных, его структура максимально проста и оно недоступно пользователям в Интернете. В следующих статьях мы разберем, как вырастить из нашей заготовки “настоящее” веб-приложение на aiohttp и опубликовать его в Интернете.</p> <p>Весь код статьи можно найти на гитхабе.</p> <p>Прочитать вторую статью из цикла «Asycnio для начинающих можно по ссылке»:<br /><em>«Подключаем базу данных к приложению»</em></p> <h5>��Асинхронное программирование на Python для джуниор-разработчиков��</h5> <p>Асинхронное программирование используется для высоко­нагруженных проектов и микросервисов. Его спрашивают на собеседованиях в технологически развитых компаниях, и оно открывает дорогу к работе в интересных проектах. Если вы уже пишете на Python, но пока не изучили модуль Asyncio, приглашаю вас <u>на курс по асинхронному программированию на Python</u>. Четвёртый поток стартует 13 октября.</p> <p>Разберётесь, как работает асинхронное программи­рование и где его лучше применять.</p> <p>Получите опыт работы с микросервисами.</p> <p>Освоите стандартную python-библиотеку Asyncio, напишите чат-бота и event loop.</p> <h2>Welcome to AIOHTTP¶</h2> <p>Asynchronous HTTP Client/Server for asyncio and Python.</p> <p>Current version is 3.8.4.</p> <h3>Key Features¶</h3> <p>Supports both Server WebSockets and Client WebSockets out-of-the-box without the Callback Hell.</p> <p>Web-server has Middlewares , Signals and plugable routing.</p> <h3>Library Installation¶</h3> <p>You may want to install <em>optional</em> cchardet library as faster replacement for charset-normalizer :</p> <p>Note that the cchardet project is known not to support Python 3.10 or higher. See #6819 and GitHub: PyYoshi/cChardet/issues/77 for more details.</p> <p>For speeding up DNS resolving by client API you may install aiodns as well. This option is highly recommended:</p> <h4>Installing speedups altogether¶</h4> <p>The following will get you aiohttp along with cchardet , aiodns and Brotli in one bundle. No need to type separate commands anymore!</p> <h3>Getting Started¶</h3> <h4>Client example¶</h4> <h4>Server example:¶</h4> <p>For more information please visit Client and Server pages.</p> <h3>What’s new in aiohttp 3?¶</h3> <p>Go to What’s new in aiohttp 3.0 page for aiohttp 3.0 major release changes.</p> <h3>Tutorial¶</h3> <h3>Source code¶</h3> <p>The project is hosted on GitHub</p> <p>Please feel free to file an issue on the bug tracker if you have found a bug or have some suggestion in order to improve the library.</p> <p>The library uses Azure Pipelines for Continuous Integration.</p> <h3>Dependencies¶</h3> <p>Install it explicitly via:</p> <p><em>Optional</em> aiodns for fast DNS resolving. The library is highly recommended.</p> <h3>Communication channels¶</h3> <p>Feel free to post your questions and ideas here.</p> <p>We support Stack Overflow. Please add <em>aiohttp</em> tag to your question there.</p> <h3>Contributing¶</h3> <p>Please read the instructions for contributors before making a Pull Request.</p> <h3>Authors and License¶</h3> <p>The aiohttp package is written mostly by Nikolay Kim and Andrew Svetlov.</p> <p>It’s <em>Apache 2</em> licensed and freely available.</p> <p>Feel free to improve this package and send a pull request to GitHub.</p> <h3>Policy for Backward Incompatible Changes¶</h3> <p><em>aiohttp</em> keeps backward compatibility.</p> <p>After deprecating some <em>Public API</em> (method, class, function argument, etc.) the library guaranties the usage of <em>deprecated API</em> is still allowed at least for a year and half after publishing new release with deprecation.</p> <p>All deprecations are reflected in documentation and raises DeprecationWarning .</p> <p>Sometimes we are forced to break the own rule for sake of very strong reason. Most likely the reason is a critical bug which cannot be solved without major API change, but we are working hard for keeping these changes as rare as possible.</p> <div class="penci-single-link-pages"> </div> </div> </div> <div class="post-pagination pcpagp-style-4"> <div class="prev-post"> <a style="background-image:url(https://gshimki.ru/wp-content/themes/soledad/images/no-image.jpg)" class="penci-lazy penci-post-nav-thumb penci-holder-load penci-image-holder" href="https://gshimki.ru/telefon/4/an-yandex-ru-kak-zablokirovat"> </a> <div class="prev-post-inner"> <div class="prev-post-title"> <span>предыдущая запись</span> </div> <a href="https://gshimki.ru/telefon/4/an-yandex-ru-kak-zablokirovat"> <div class="pagi-text"> <h5 class="prev-title">An yandex ru как заблокировать</h5> </div> </a> </div> </div> <div class="next-post"> <a style="background-image:url(https://gshimki.ru/wp-content/themes/soledad/images/no-image.jpg)" class="penci-lazy penci-post-nav-thumb penci-holder-load nav-thumb-next penci-image-holder" href="https://gshimki.ru/tehnologija/39/alt-rutor-org-kak-udalit"> </a> <div class="next-post-inner"> <div class="prev-post-title next-post-title"> <span>следующий пост</span> </div> <a href="https://gshimki.ru/tehnologija/39/alt-rutor-org-kak-udalit"> <div class="pagi-text"> <h5 class="next-title">Alt rutor org как удалить</h5> </div> </a> </div> </div> </div> <div class="pcrlt-style-1 post-related"> <div class="post-title-box"><h4 class="post-box-title">Похожие статьи</h4></div> <div class="swiper penci-owl-carousel penci-owl-carousel-slider penci-related-carousel" data-lazy="true" data-item="3" data-desktop="3" data-tablet="2" data-tabsmall="2" data-auto="false" data-speed="300" data-dots="true"> <div class="swiper-wrapper"> <div class="item-related swiper-slide"> <div class="item-related-inner"> <div class="related-content"> <h3> <a href="https://gshimki.ru/tehnologija/39/jazykovoj-paket-microsoft-visual-studio-2010-tools">Языковой пакет microsoft visual studio 2010 tools что...</a> </h3> <span class="date"><time class="entry-date published" datetime="2023-03-14T06:36:17+03:00">14.03.2023</time></span> </div> </div> </div> <div class="item-related swiper-slide"> <div class="item-related-inner"> <div class="related-content"> <h3> <a href="https://gshimki.ru/tehnologija/39/jelementy-oglavlenija-ne-najdeny-chto-delat">Элементы оглавления не найдены что делать</a> </h3> <span class="date"><time class="entry-date published" datetime="2023-03-14T06:36:16+03:00">14.03.2023</time></span> </div> </div> </div> <div class="item-related swiper-slide"> <div class="item-related-inner"> <div class="related-content"> <h3> <a href="https://gshimki.ru/tehnologija/39/chto-takoe-chanki-v-anglijskom-jazyke">Что такое чанки в английском языке</a> </h3> <span class="date"><time class="entry-date published" datetime="2023-03-14T06:36:15+03:00">14.03.2023</time></span> </div> </div> </div> <div class="item-related swiper-slide"> <div class="item-related-inner"> <div class="related-content"> <h3> <a href="https://gshimki.ru/tehnologija/39/chto-takoe-shhelchok-3-15">Что такое щелчок 3 15</a> </h3> <span class="date"><time class="entry-date published" datetime="2023-03-14T06:36:15+03:00">14.03.2023</time></span> </div> </div> </div> <div class="item-related swiper-slide"> <div class="item-related-inner"> <div class="related-content"> <h3> <a href="https://gshimki.ru/tehnologija/39/chto-javljaetsja-priznakom-okonchanija-perevoda">Что является признаком окончания перевода стрелки</a> </h3> <span class="date"><time class="entry-date published" datetime="2023-03-14T06:36:15+03:00">14.03.2023</time></span> </div> </div> </div> <div class="item-related swiper-slide"> <div class="item-related-inner"> <div class="related-content"> <h3> <a href="https://gshimki.ru/tehnologija/39/chto-takoe-fejsbuk-lajt">Что такое фейсбук лайт</a> </h3> <span class="date"><time class="entry-date published" datetime="2023-03-14T06:36:14+03:00">14.03.2023</time></span> </div> </div> </div> <div class="item-related swiper-slide"> <div class="item-related-inner"> <div class="related-content"> <h3> <a href="https://gshimki.ru/tehnologija/39/chto-takoe-soprocessor-v-dispetchere-ustrojstv">Что такое сопроцессор в диспетчере устройств windows 10</a> </h3> <span class="date"><time class="entry-date published" datetime="2023-03-14T06:36:13+03:00">14.03.2023</time></span> </div> </div> </div> <div class="item-related swiper-slide"> <div class="item-related-inner"> <div class="related-content"> <h3> <a href="https://gshimki.ru/tehnologija/39/chto-takoe-stjek-v-rjepe">Что такое стэк в рэпе</a> </h3> <span class="date"><time class="entry-date published" datetime="2023-03-14T06:36:13+03:00">14.03.2023</time></span> </div> </div> </div> <div class="item-related swiper-slide"> <div class="item-related-inner"> <div class="related-content"> <h3> <a href="https://gshimki.ru/tehnologija/39/chto-takoe-sobytija-i-s-chem-oni-svjazany-v-1s">Что такое события и с чем они связаны...</a> </h3> <span class="date"><time class="entry-date published" datetime="2023-03-14T06:36:13+03:00">14.03.2023</time></span> </div> </div> </div> <div class="item-related swiper-slide"> <div class="item-related-inner"> <div class="related-content"> <h3> <a href="https://gshimki.ru/tehnologija/39/chto-takoe-protokol-x10">Что такое протокол x10</a> </h3> <span class="date"><time class="entry-date published" datetime="2023-03-14T06:36:12+03:00">14.03.2023</time></span> </div> </div> </div> </div><div class="penci-owl-dots"></div></div></div> </article> </div> </div> <div id="sidebar" class="penci-sidebar-right penci-sidebar-content style-5 pcalign-left pciconp-right pcicon-right penci-sticky-sidebar"> <div class="theiaStickySidebar"> <aside id="penci_latest_news_widget-1" class="widget penci_latest_news_widget"><h3 class="widget-title penci-border-arrow"><span class="inner-arrow">Новые публикации</span></h3> <ul id="penci-latestwg-4829" class="side-newsfeed penci-feed-2columns penci-2columns-featured"> <li class="penci-feed featured-news"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/uvidjat-76-mlrd-chelovek-asteroid-apofis-podletit-k-zemle-na-rasstojanie-blizhe-sputnikov-b65452e-585x390.jpg" class="penci-lazy penci-image-holder" rel="bookmark" href="https://gshimki.ru/science/yvidiat-76-mlrd-chelovek-asteroid-apofis-podletit-k-zemle-na-rasstoianie-blije-spytnikov" title="«Увидят 7,6 млрд человек»: астероид Апофис подлетит к Земле на расстояние ближе спутников"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/science/yvidiat-76-mlrd-chelovek-asteroid-apofis-podletit-k-zemle-na-rasstoianie-blije-spytnikov" rel="bookmark" title="«Увидят 7,6 млрд человек»: астероид Апофис подлетит к Земле на расстояние ближе спутников"> «Увидят 7,6 млрд человек»: астероид Апофис подлетит к Земле на расстояние ближе спутников </a> </h4> <div class="grid-post-box-meta penci-side-item-meta pcsnmt-below"> <span class="side-item-meta side-wdate"><time class="entry-date published" datetime="2026-07-22T23:49:44+03:00">22.07.2026</time></span> </div> </div> </div> </li> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/johnson-amp-johnson-poluchila-odobrenie-fda-na-novuju-hirurgicheskuju-sistemu-6b71642-263x175.jpg" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/finansy/johnson-johnson-polychila-odobrenie-fda-na-novyu-hiryrgicheskyu-sistemy" title="Johnson & Johnson получила одобрение FDA на новую хирургическую систему"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/finansy/johnson-johnson-polychila-odobrenie-fda-na-novyu-hiryrgicheskyu-sistemy" rel="bookmark" title="Johnson & Johnson получила одобрение FDA на новую хирургическую систему"> Johnson & Johnson получила одобрение FDA на новую хирургическую систему </a> </h4> <div class="grid-post-box-meta penci-side-item-meta pcsnmt-below"> <span class="side-item-meta side-wdate"><time class="entry-date published" datetime="2026-07-22T22:49:45+03:00">22.07.2026</time></span> </div> </div> </div> </li> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/istreblenie-russkih-zaharova-rasskazala-o-pytkah-vsu-v-konstantinovke-711efd6-263x175.webp" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/news/istreblenie-rysskih-zaharova-rasskazala-o-pytkah-vsy-v-konstantinovke" title="Истребление русских. Захарова рассказала о пытках ВСУ в Константиновке"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/news/istreblenie-rysskih-zaharova-rasskazala-o-pytkah-vsy-v-konstantinovke" rel="bookmark" title="Истребление русских. Захарова рассказала о пытках ВСУ в Константиновке"> Истребление русских. Захарова рассказала о пытках ВСУ в Константиновке </a> </h4> <div class="grid-post-box-meta penci-side-item-meta pcsnmt-below"> <span class="side-item-meta side-wdate"><time class="entry-date published" datetime="2026-07-22T21:49:48+03:00">22.07.2026</time></span> </div> </div> </div> </li> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/oleg-vinnik-objavil-o-razvode-s-suprugoj-ne-ishhite-prichin-6f5fd6c-263x175.webp" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/zvezdy/oleg-vinnik-obiavil-o-razvode-s-syprygoi-ne-ishite-prichin" title="Олег Винник объявил о разводе с супругой: «Не ищите причин»"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/zvezdy/oleg-vinnik-obiavil-o-razvode-s-syprygoi-ne-ishite-prichin" rel="bookmark" title="Олег Винник объявил о разводе с супругой: «Не ищите причин»"> Олег Винник объявил о разводе с супругой: «Не ищите причин» </a> </h4> <div class="grid-post-box-meta penci-side-item-meta pcsnmt-below"> <span class="side-item-meta side-wdate"><time class="entry-date published" datetime="2026-07-22T20:49:42+03:00">22.07.2026</time></span> </div> </div> </div> </li> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/aeroport-sheremetevo-uvelichil-zony-besplatnoj-parkovki-dlja-invalidov-v-terminalah-v-i-s-b1af911-263x175.jpg" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/turizm/aeroport-sheremetevo-yvelichil-zony-besplatnoi-parkovki-dlia-invalidov-v-terminalah-v-i-s" title="Аэропорт Шереметьево увеличил зоны бесплатной парковки для инвалидов в Терминалах В и С"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/turizm/aeroport-sheremetevo-yvelichil-zony-besplatnoi-parkovki-dlia-invalidov-v-terminalah-v-i-s" rel="bookmark" title="Аэропорт Шереметьево увеличил зоны бесплатной парковки для инвалидов в Терминалах В и С"> Аэропорт Шереметьево увеличил зоны бесплатной парковки для инвалидов в Терминалах В и С </a> </h4> <div class="grid-post-box-meta penci-side-item-meta pcsnmt-below"> <span class="side-item-meta side-wdate"><time class="entry-date published" datetime="2026-07-22T19:49:43+03:00">22.07.2026</time></span> </div> </div> </div> </li> </ul> </aside> </div> </div> </div> </div> </div> <div class="clear-footer"></div> <div id="widget-area" > <div class="container"> <div class="footer-widget-wrapper footer-widget-style-1"> <aside id="penci_latest_news_widget-2" class="widget penci_latest_news_widget"><h4 class="widget-title penci-border-arrow"><span class="inner-arrow">Выбор редакции</span></h4> <ul id="penci-latestwg-9977" class="side-newsfeed"> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/na-slavjanskom-bazare-v-vitebske-stalo-bolshe-blogerov-detskogo-vozrasta-7dcc664-263x175.jpg" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/kultura/na-slavianskom-bazare-v-vitebske-stalo-bolshe-blogerov-detskogo-vozrasta" title="На «Славянском базаре в Витебске» стало больше блогеров детского возраста"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/kultura/na-slavianskom-bazare-v-vitebske-stalo-bolshe-blogerov-detskogo-vozrasta" rel="bookmark" title="На «Славянском базаре в Витебске» стало больше блогеров детского возраста"> На «Славянском базаре в Витебске» стало больше блогеров детского возраста </a> </h4> </div> </div> </li> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/v-kremle-prokommentirovali-situaciju-s-wildberries-posle-ataki-399f33a-263x175.jpg" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/finansy/v-kremle-prokommentirovali-sityaciu-s-wildberries-posle-ataki" title="В Кремле прокомментировали ситуацию с Wildberries после атаки"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/finansy/v-kremle-prokommentirovali-sityaciu-s-wildberries-posle-ataki" rel="bookmark" title="В Кремле прокомментировали ситуацию с Wildberries после атаки"> В Кремле прокомментировали ситуацию с Wildberries после атаки </a> </h4> </div> </div> </li> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/v-podmoskove-bolee-500-predprinimatelej-poluchili-subsidii-na-franshizu-6aa0d6c-263x175.jpg" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/finansy/v-podmoskove-bolee-500-predprinimatelei-polychili-sybsidii-na-franshizy" title="В Подмосковье более 500 предпринимателей получили субсидии на франшизу"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/finansy/v-podmoskove-bolee-500-predprinimatelei-polychili-sybsidii-na-franshizy" rel="bookmark" title="В Подмосковье более 500 предпринимателей получили субсидии на франшизу"> В Подмосковье более 500 предпринимателей получили субсидии на франшизу </a> </h4> </div> </div> </li> </ul> </aside> </div> <div class="footer-widget-wrapper footer-widget-style-1"> <aside id="penci_latest_news_widget-5" class="widget penci_latest_news_widget"><h4 class="widget-title penci-border-arrow"><span class="inner-arrow">Выбор пользователя</span></h4> <ul id="penci-latestwg-1423" class="side-newsfeed"> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/v-shardzhe-sozdali-lokalnyj-brend-premialnogo-shokolada-0b56bfc-263x175.jpg" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/turizm/v-shardje-sozdali-lokalnyi-brend-premialnogo-shokolada" title="В Шардже создали локальный бренд премиального шоколада"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/turizm/v-shardje-sozdali-lokalnyi-brend-premialnogo-shokolada" rel="bookmark" title="В Шардже создали локальный бренд премиального шоколада"> В Шардже создали локальный бренд премиального шоколада </a> </h4> </div> </div> </li> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/kosenko-prokommentiroval-obvinenija-instasamki-v-ispolzovanii-ejo-golosa-39c9ea4-263x175.webp" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/zvezdy/kosenko-prokommentiroval-obvineniia-instasamki-v-ispolzovanii-ee-golosa" title="Косенко прокомментировал обвинения Инстасамки в использовании её голоса"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/zvezdy/kosenko-prokommentiroval-obvineniia-instasamki-v-ispolzovanii-ee-golosa" rel="bookmark" title="Косенко прокомментировал обвинения Инстасамки в использовании её голоса"> Косенко прокомментировал обвинения Инстасамки в использовании её голоса </a> </h4> </div> </div> </li> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/akcii-nebius-vzleteli-posle-raskrytija-doli-nvidia-v-razmere-93-3eb9626-263x175.jpg" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/finansy/akcii-nebius-vzleteli-posle-raskrytiia-doli-nvidia-v-razmere-93" title="Акции Nebius взлетели после раскрытия доли Nvidia в размере 9,3%"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/finansy/akcii-nebius-vzleteli-posle-raskrytiia-doli-nvidia-v-razmere-93" rel="bookmark" title="Акции Nebius взлетели после раскрытия доли Nvidia в размере 9,3%"> Акции Nebius взлетели после раскрытия доли Nvidia в размере 9,3% </a> </h4> </div> </div> </li> </ul> </aside> </div> <div class="footer-widget-wrapper footer-widget-style-1 last"> <aside id="penci_latest_news_widget-3" class="widget penci_latest_news_widget"><h4 class="widget-title penci-border-arrow"><span class="inner-arrow">Это интересно</span></h4> <ul id="penci-latestwg-4347" class="side-newsfeed"> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/johnson-amp-johnson-poluchila-odobrenie-fda-na-novuju-hirurgicheskuju-sistemu-6b71642-263x175.jpg" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/finansy/johnson-johnson-polychila-odobrenie-fda-na-novyu-hiryrgicheskyu-sistemy" title="Johnson & Johnson получила одобрение FDA на новую хирургическую систему"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/finansy/johnson-johnson-polychila-odobrenie-fda-na-novyu-hiryrgicheskyu-sistemy" rel="bookmark" title="Johnson & Johnson получила одобрение FDA на новую хирургическую систему"> Johnson & Johnson получила одобрение FDA на новую хирургическую систему </a> </h4> </div> </div> </li> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/gosduma-prodlila-garazhnuju-amnistiju-do-1-sentjabrja-2031-goda-f87fe90-263x175.jpg" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/finansy/gosdyma-prodlila-garajnyu-amnistiu-do-1-sentiabria-2031-goda" title="Госдума продлила гаражную амнистию до 1 сентября 2031 года"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/finansy/gosdyma-prodlila-garajnyu-amnistiu-do-1-sentiabria-2031-goda" rel="bookmark" title="Госдума продлила гаражную амнистию до 1 сентября 2031 года"> Госдума продлила гаражную амнистию до 1 сентября 2031 года </a> </h4> </div> </div> </li> <li class="penci-feed"> <div class="side-item"> <div class="side-image"> <a data-bgset="https://gshimki.ru/wp-content/uploads/2026/07/v-rossii-pojavilsja-instrument-dlja-pokupki-zolota-s-zashhitoj-ot-padenija-ceny-cf9fff4-263x175.jpg" class="penci-lazy penci-image-holder small-fix-size" rel="bookmark" href="https://gshimki.ru/finansy/v-rossii-poiavilsia-instryment-dlia-pokypki-zolota-s-zashitoi-ot-padeniia-ceny" title="В России появился инструмент для покупки золота с защитой от падения цены"> </a> </div> <div class="side-item-text"> <h4 class="side-title-post"> <a href="https://gshimki.ru/finansy/v-rossii-poiavilsia-instryment-dlia-pokypki-zolota-s-zashitoi-ot-padeniia-ceny" rel="bookmark" title="В России появился инструмент для покупки золота с защитой от падения цены"> В России появился инструмент для покупки золота с защитой от падения цены </a> </h4> </div> </div> </li> </ul> </aside> </div> </div> </div> <footer id="footer-section" class="penci-footer-social-media footer-social-remove-circle footer-social-remove-text " itemscope itemtype="https://schema.org/WPFooter"> <div class="container"> <div class="footer-logo-copyright footer-not-logo footer-not-gotop"> <div class="footer-menu-wrap" role="navigation" itemscope itemtype="https://schema.org/SiteNavigationElement"> </div> <div id="footer-copyright"> <p>@2026 - Gshimki.ru. Все права защищены.</p> </div> </div> </div> </footer> </div><!-- End .wrapper-boxed --><script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/soledad-child/*","/wp-content/themes/soledad/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <script>document.addEventListener("copy", (event) => {var pagelink = "\nИсточник: https://gshimki.ru/tehnologija/39/aiohttp-python-chto-jeto";event.clipboardData.setData("text", document.getSelection() + pagelink);event.preventDefault();});</script> <div class="penci-go-to-top-floating pgtt-style-1"><i class="penciicon-up-chevron"></i></div> <a href="#" id="close-sidebar-nav" class="header-9 mstyle-default"><i class="penci-faicon fa fa-close" ></i></a> <nav id="sidebar-nav" class="header-9 mstyle-default" role="navigation" itemscope itemtype="https://schema.org/SiteNavigationElement"> <div id="sidebar-nav-logo"> <a href="https://gshimki.ru/"><img class="penci-lazy sidebar-nav-logo penci-limg" src="data:image/svg+xml,%3Csvg%20xmlns='http://www.w3.org/2000/svg'%20viewBox='0%200%201022%20331'%3E%3C/svg%3E" width="1022" height="331" data-src="https://gshimki.ru/wp-content/uploads/2026/07/logo-1.png" data-lightlogo="https://gshimki.ru/wp-content/uploads/2026/07/logo-1.png" alt="Глобальный Фокус"/></a> </div> <ul id="menu-glavnoe-1" class="menu"><li class="menu-item menu-item-type-custom menu-item-object-custom menu-item-home ajax-mega-menu menu-item-38815"><a href="https://gshimki.ru/">Главная</a></li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category ajax-mega-menu penci-megapos-flexible penci-mega-menu menu-item-38819"><a href="https://gshimki.ru/category/news">Мировые новости</a> <ul class="sub-menu"> <li class="penci-mega-menu-item penci-megamenu-38819 menu-item-0"><div class="penci-megamenu normal-cat-menu penc-menu-38819" data-id="45e54ca2c1" data-menu="glavnoe" data-item="1" data-catid="1" data-number="1" data-style="1" data-position="side"></div></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category ajax-mega-menu penci-megapos-flexible penci-mega-menu menu-item-38823"><a href="https://gshimki.ru/category/finansy">Финансы</a> <ul class="sub-menu"> <li class="penci-mega-menu-item penci-megamenu-38823 menu-item-0"><div class="penci-megamenu normal-cat-menu penc-menu-38823" data-id="45e54ca2c1" data-menu="glavnoe" data-item="2" data-catid="76" data-number="1" data-style="1" data-position="side"></div></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category ajax-mega-menu penci-megapos-flexible penci-mega-menu menu-item-38820"><a href="https://gshimki.ru/category/science">Наука и технологии</a> <ul class="sub-menu"> <li class="penci-mega-menu-item penci-megamenu-38820 menu-item-0"><div class="penci-megamenu normal-cat-menu penc-menu-38820" data-id="45e54ca2c1" data-menu="glavnoe" data-item="3" data-catid="75" data-number="1" data-style="1" data-position="side"></div></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category ajax-mega-menu penci-megapos-flexible penci-mega-menu menu-item-38818"><a href="https://gshimki.ru/category/kultura">Культура</a> <ul class="sub-menu"> <li class="penci-mega-menu-item penci-megamenu-38818 menu-item-0"><div class="penci-megamenu normal-cat-menu penc-menu-38818" data-id="45e54ca2c1" data-menu="glavnoe" data-item="4" data-catid="78" data-number="1" data-style="1" data-position="side"></div></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category ajax-mega-menu penci-megapos-flexible penci-mega-menu menu-item-38816"><a href="https://gshimki.ru/category/avtomobili">Автомобили</a> <ul class="sub-menu"> <li class="penci-mega-menu-item penci-megamenu-38816 menu-item-0"><div class="penci-megamenu normal-cat-menu penc-menu-38816" data-id="45e54ca2c1" data-menu="glavnoe" data-item="5" data-catid="74" data-number="1" data-style="1" data-position="side"></div></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category ajax-mega-menu penci-megapos-flexible penci-mega-menu menu-item-38822"><a href="https://gshimki.ru/category/turizm">Туризм</a> <ul class="sub-menu"> <li class="penci-mega-menu-item penci-megamenu-38822 menu-item-0"><div class="penci-megamenu normal-cat-menu penc-menu-38822" data-id="45e54ca2c1" data-menu="glavnoe" data-item="6" data-catid="73" data-number="1" data-style="1" data-position="side"></div></li> </ul> </li> <li class="menu-item menu-item-type-taxonomy menu-item-object-category ajax-mega-menu penci-megapos-flexible penci-mega-menu menu-item-38817"><a href="https://gshimki.ru/category/zvezdy">Звезды</a> <ul class="sub-menu"> <li class="penci-mega-menu-item penci-megamenu-38817 menu-item-0"><div class="penci-megamenu normal-cat-menu penc-menu-38817" data-id="45e54ca2c1" data-menu="glavnoe" data-item="7" data-catid="77" data-number="1" data-style="1" data-position="side"></div></li> </ul> </li> </ul> </nav> <script id="penci-play-js-js" src="https://gshimki.ru/wp-content/plugins/penci-shortcodes/assets/play.js?ver=7a22247de8db"></script> <script id="toc-front-js-extra"> var tocplus = {"smooth_scroll":"1","smooth_scroll_offset":"50"}; //# sourceURL=toc-front-js-extra </script> <script id="toc-front-js" src="https://gshimki.ru/wp-content/plugins/table-of-contents-plus/front.min.js?ver=2249c9d829b3"></script> <script id="js-cookies-js" src="https://gshimki.ru/wp-content/themes/soledad/js/js-cookies.js?ver=496cc09f4e75"></script> <script id="pc-lazy-js" src="https://gshimki.ru/wp-content/themes/soledad/js/penci-lazy.js?ver=496cc09f4e75"></script> <script id="penci-libs-js-js" src="https://gshimki.ru/wp-content/themes/soledad/js/libs-script.min.js?ver=496cc09f4e75"></script> <script id="main-scripts-js-extra"> var ajax_var_more = {"url":"https://gshimki.ru/wp-admin/admin-ajax.php","megamenu_url":"https://gshimki.ru/wp-admin/admin-ajax.php","archive_more_url":"https://gshimki.ru/wp-admin/admin-ajax.php","nonce":"b6354e1cca","wp_rest":"c67ed343c3","errorPass":"\u003Cp class=\"message message-error\"\u003E\u041f\u0430\u0440\u043e\u043b\u044c \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\u003C/p\u003E","login":"\u0410\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b","more":"\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435","password":"\u041f\u0430\u0440\u043e\u043b\u044c","headerstyle":"default","reading_bar_pos":"footer","reading_bar_h":"5","carousel_e":"swing","slider_e":"creative","fcarousel_e":"swing","fslider_e":"creative","vfloat":"","vfloatp":"bottom-right","redirect_url":"","search_multi":"","search_multi_txt":[""],"rest_url":"https://gshimki.ru/wp-json/"}; //# sourceURL=main-scripts-js-extra </script> <script id="main-scripts-js" src="https://gshimki.ru/wp-content/themes/soledad/js/main.js?ver=496cc09f4e75"></script> <script id="penci_ajax_like_post-js" src="https://gshimki.ru/wp-content/themes/soledad/js/post-like.js?ver=496cc09f4e75"></script> <script async data-wp-strategy="async" fetchpriority="low" id="comment-reply-js" src="https://gshimki.ru/wp-includes/js/comment-reply.min.js?ver=28d14b47338f"></script> <script id="jquery.inview-js" src="https://gshimki.ru/wp-content/themes/soledad/js/inview.js?ver=496cc09f4e75"></script> <script id="penci-sticky-share-js" src="https://gshimki.ru/wp-content/themes/soledad/js/sticky_share.js?ver=496cc09f4e75"></script> <script id="penci_widgets_ajax-js-extra"> var penci_widgets_ajax = {"url":"https://gshimki.ru/wp-admin/admin-ajax.php","nonce":"c4a76c9c49"}; //# sourceURL=penci_widgets_ajax-js-extra </script> <script id="penci_widgets_ajax-js" src="https://gshimki.ru/wp-content/themes/soledad/js/widgets-ajax.js?ver=496cc09f4e75"></script> <script>!function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("test",null,e)}catch(t){}return t}()||function(i){var o=!0,s=!1;EventTarget.prototype.addEventListener=function(t,e,n){var r="object"==typeof n,a=r?n.capture:n;n=r?n:{},"touchstart"!=t&&"scroll"!=t&&"wheel"!=t||(n.passive=void 0!==n.passive?n.passive:o),n.capture=void 0!==a?a:s,i.call(this,t,e,n)}}(EventTarget.prototype.addEventListener);</script><script type='text/javascript' id="soledad-pagespeed-header" data-cfasync="false">!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(n="undefined"!=typeof globalThis?globalThis:n||self).LazyLoad=t()}(this,(function(){"use strict";function n(){return n=Object.assign||function(n){for(var t=1;t<arguments.length;t++){var e=arguments[t];for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(n[i]=e[i])}return n},n.apply(this,arguments)}var t="undefined"!=typeof window,e=t&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),i=t&&"IntersectionObserver"in window,o=t&&"classList"in document.createElement("p"),a=t&&window.devicePixelRatio>1,r={elements_selector:".lazy",container:e||t?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_poster:"poster",class_applied:"applied",class_loading:"loading",class_loaded:"loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1},c=function(t){return n({},r,t)},u=function(n,t){var e,i="LazyLoad::Initialized",o=new n(t);try{e=new CustomEvent(i,{detail:{instance:o}})}catch(n){(e=document.createEvent("CustomEvent")).initCustomEvent(i,!1,!1,{instance:o})}window.dispatchEvent(e)},l="src",s="srcset",f="sizes",d="poster",_="llOriginalAttrs",g="loading",v="loaded",b="applied",p="error",h="native",m="data-",E="ll-status",I=function(n,t){return n.getAttribute(m+t)},y=function(n){return I(n,E)},A=function(n,t){return function(n,t,e){var i="data-ll-status";null!==e?n.setAttribute(i,e):n.removeAttribute(i)}(n,0,t)},k=function(n){return A(n,null)},L=function(n){return null===y(n)},w=function(n){return y(n)===h},x=[g,v,b,p],O=function(n,t,e,i){n&&(void 0===i?void 0===e?n(t):n(t,e):n(t,e,i))},N=function(n,t){o?n.classList.add(t):n.className+=(n.className?" ":"")+t},C=function(n,t){o?n.classList.remove(t):n.className=n.className.replace(new RegExp("(^|\\s+)"+t+"(\\s+|$)")," ").replace(/^\s+/,"").replace(/\s+$/,"")},M=function(n){return n.llTempImage},z=function(n,t){if(t){var e=t._observer;e&&e.unobserve(n)}},R=function(n,t){n&&(n.loadingCount+=t)},T=function(n,t){n&&(n.toLoadCount=t)},G=function(n){for(var t,e=[],i=0;t=n.children[i];i+=1)"SOURCE"===t.tagName&&e.push(t);return e},D=function(n,t){var e=n.parentNode;e&&"PICTURE"===e.tagName&&G(e).forEach(t)},V=function(n,t){G(n).forEach(t)},F=[l],j=[l,d],P=[l,s,f],S=function(n){return!!n[_]},U=function(n){return n[_]},$=function(n){return delete n[_]},q=function(n,t){if(!S(n)){var e={};t.forEach((function(t){e[t]=n.getAttribute(t)})),n[_]=e}},H=function(n,t){if(S(n)){var e=U(n);t.forEach((function(t){!function(n,t,e){e?n.setAttribute(t,e):n.removeAttribute(t)}(n,t,e[t])}))}},B=function(n,t,e){N(n,t.class_loading),A(n,g),e&&(R(e,1),O(t.callback_loading,n,e))},J=function(n,t,e){e&&n.setAttribute(t,e)},K=function(n,t){J(n,f,I(n,t.data_sizes)),J(n,s,I(n,t.data_srcset)),J(n,l,I(n,t.data_src))},Q={IMG:function(n,t){D(n,(function(n){q(n,P),K(n,t)})),q(n,P),K(n,t)},IFRAME:function(n,t){q(n,F),J(n,l,I(n,t.data_src))},VIDEO:function(n,t){V(n,(function(n){q(n,F),J(n,l,I(n,t.data_src))})),q(n,j),J(n,d,I(n,t.data_poster)),J(n,l,I(n,t.data_src)),n.load()}},W=["IMG","IFRAME","VIDEO"],X=function(n,t){!t||function(n){return n.loadingCount>0}(t)||function(n){return n.toLoadCount>0}(t)||O(n.callback_finish,t)},Y=function(n,t,e){n.addEventListener(t,e),n.llEvLisnrs[t]=e},Z=function(n,t,e){n.removeEventListener(t,e)},nn=function(n){return!!n.llEvLisnrs},tn=function(n){if(nn(n)){var t=n.llEvLisnrs;for(var e in t){var i=t[e];Z(n,e,i)}delete n.llEvLisnrs}},en=function(n,t,e){!function(n){delete n.llTempImage}(n),R(e,-1),function(n){n&&(n.toLoadCount-=1)}(e),C(n,t.class_loading),t.unobserve_completed&&z(n,e)},on=function(n,t,e){var i=M(n)||n;nn(i)||function(n,t,e){nn(n)||(n.llEvLisnrs={});var i="VIDEO"===n.tagName?"loadeddata":"load";Y(n,i,t),Y(n,"error",e)}(i,(function(o){!function(n,t,e,i){var o=w(t);en(t,e,i),N(t,e.class_loaded),A(t,v),O(e.callback_loaded,t,i),o||X(e,i)}(0,n,t,e),tn(i)}),(function(o){!function(n,t,e,i){var o=w(t);en(t,e,i),N(t,e.class_error),A(t,p),O(e.callback_error,t,i),o||X(e,i)}(0,n,t,e),tn(i)}))},an=function(n,t,e){!function(n){n.llTempImage=document.createElement("IMG")}(n),on(n,t,e),function(n){S(n)||(n[_]={backgroundImage:n.style.backgroundImage})}(n),function(n,t,e){var i=I(n,t.data_bg),o=I(n,t.data_bg_hidpi),r=a&&o?o:i;r&&(n.style.backgroundImage='url("'.concat(r,'")'),M(n).setAttribute(l,r),B(n,t,e))}(n,t,e),function(n,t,e){var i=I(n,t.data_bg_multi),o=I(n,t.data_bg_multi_hidpi),r=a&&o?o:i;r&&(n.style.backgroundImage=r,function(n,t,e){N(n,t.class_applied),A(n,b),e&&(t.unobserve_completed&&z(n,t),O(t.callback_applied,n,e))}(n,t,e))}(n,t,e)},rn=function(n,t,e){!function(n){return W.indexOf(n.tagName)>-1}(n)?an(n,t,e):function(n,t,e){on(n,t,e),function(n,t,e){var i=Q[n.tagName];i&&(i(n,t),B(n,t,e))}(n,t,e)}(n,t,e)},cn=function(n){n.removeAttribute(l),n.removeAttribute(s),n.removeAttribute(f)},un=function(n){D(n,(function(n){H(n,P)})),H(n,P)},ln={IMG:un,IFRAME:function(n){H(n,F)},VIDEO:function(n){V(n,(function(n){H(n,F)})),H(n,j),n.load()}},sn=function(n,t){(function(n){var t=ln[n.tagName];t?t(n):function(n){if(S(n)){var t=U(n);n.style.backgroundImage=t.backgroundImage}}(n)})(n),function(n,t){L(n)||w(n)||(C(n,t.class_entered),C(n,t.class_exited),C(n,t.class_applied),C(n,t.class_loading),C(n,t.class_loaded),C(n,t.class_error))}(n,t),k(n),$(n)},fn=["IMG","IFRAME","VIDEO"],dn=function(n){return n.use_native&&"loading"in HTMLImageElement.prototype},_n=function(n,t,e){n.forEach((function(n){return function(n){return n.isIntersecting||n.intersectionRatio>0}(n)?function(n,t,e,i){var o=function(n){return x.indexOf(y(n))>=0}(n);A(n,"entered"),N(n,e.class_entered),C(n,e.class_exited),function(n,t,e){t.unobserve_entered&&z(n,e)}(n,e,i),O(e.callback_enter,n,t,i),o||rn(n,e,i)}(n.target,n,t,e):function(n,t,e,i){L(n)||(N(n,e.class_exited),function(n,t,e,i){e.cancel_on_exit&&function(n){return y(n)===g}(n)&&"IMG"===n.tagName&&(tn(n),function(n){D(n,(function(n){cn(n)})),cn(n)}(n),un(n),C(n,e.class_loading),R(i,-1),k(n),O(e.callback_cancel,n,t,i))}(n,t,e,i),O(e.callback_exit,n,t,i))}(n.target,n,t,e)}))},gn=function(n){return Array.prototype.slice.call(n)},vn=function(n){return n.container.querySelectorAll(n.elements_selector)},bn=function(n){return function(n){return y(n)===p}(n)},pn=function(n,t){return function(n){return gn(n).filter(L)}(n||vn(t))},hn=function(n,e){var o=c(n);this._settings=o,this.loadingCount=0,function(n,t){i&&!dn(n)&&(t._observer=new IntersectionObserver((function(e){_n(e,n,t)}),function(n){return{root:n.container===document?null:n.container,rootMargin:n.thresholds||n.threshold+"px"}}(n)))}(o,this),function(n,e){t&&window.addEventListener("online",(function(){!function(n,t){var e;(e=vn(n),gn(e).filter(bn)).forEach((function(t){C(t,n.class_error),k(t)})),t.update()}(n,e)}))}(o,this),this.update(e)};return hn.prototype={update:function(n){var t,o,a=this._settings,r=pn(n,a);T(this,r.length),!e&&i?dn(a)?function(n,t,e){n.forEach((function(n){-1!==fn.indexOf(n.tagName)&&function(n,t,e){n.setAttribute("loading","lazy"),on(n,t,e),function(n,t){var e=Q[n.tagName];e&&e(n,t)}(n,t),A(n,h)}(n,t,e)})),T(e,0)}(r,a,this):(o=r,function(n){n.disconnect()}(t=this._observer),function(n,t){t.forEach((function(t){n.observe(t)}))}(t,o)):this.loadAll(r)},destroy:function(){this._observer&&this._observer.disconnect(),vn(this._settings).forEach((function(n){$(n)})),delete this._observer,delete this._settings,delete this.loadingCount,delete this.toLoadCount},loadAll:function(n){var t=this,e=this._settings;pn(n,e).forEach((function(n){z(n,t),rn(n,e,t)}))},restoreAll:function(){var n=this._settings;vn(n).forEach((function(t){sn(t,n)}))}},hn.load=function(n,t){var e=c(t);rn(n,e)},hn.resetStatus=function(n){k(n)},t&&function(n,t){if(t)if(t.length)for(var e,i=0;e=t[i];i+=1)u(n,e);else u(n,t)}(hn,window.lazyLoadOptions),hn})); (function () { var PenciLazy = new LazyLoad({ elements_selector: '.penci-lazy', data_bg: 'bgset', class_loading: 'lazyloading', class_entered: 'lazyloaded', class_loaded: 'pcloaded', unobserve_entered: true }); MutationObserver = window.MutationObserver || window.WebKitMutationObserver; var observer = new MutationObserver(function(mutations, observer) { PenciLazy.update(); }); observer.observe(document, { subtree: true, attributes: true }); })(); </script> </body> </html>