Template engine что за папка
Это просто: щелкните на рабочий стол правой кнопкой мыши. В появившемся меню выберите «Новое-> Приложение». Введите заголовок программы, и она появится на рабочем столе.
Это делается в две стадии:
Убедитесь, что у вас есть доступ к монтированию/размонтированию этого устройства
Например, для монтирования дискеты, ваш /etc/fstab должен включать
Создайте файл kdelnk для этой файловой системы
Например, для устройства kdelnk-файл должен быть:
Большинство хранителей экрана выглядят наилучшим образом, если вы установили черный цвет фона.
Однако, при использовании хранителя экрана в качестве фона, вы тратите некоторое количество ресурсов процессора и X.
Поддержка мыши с колесом прокрутки будет добавлена в Qt 2.0. Ну а пока, для использования колеса в KFM, KEdit и не-KDE приложений, как Emacs, попробуйте взять IMWheel на http://solaris1.mysolution.com/
Папка Templates содержит элементы, которые вы можете легко создать где угодно (на Рабочем столе или в окне файл-менеджера) выбором пункта меню Новое в контекстовом меню (щелчок правой кнопкой мыши) там, где вы хотите разместить этот элемент.
Либо, напишите скрипт оболочки (shell). Если вы используете KDE 1.0, скрипт должен выглядеть примерно так:
Если вы используете KDE 1.1, тогда вам не нужно использовать скрипты оболочки. Вы просто должны выполнить следующее:
Возьмите MacOS и другие темы с http://kde.themes.org. Вы можете найти другие дополнительные пиктограммы на http://icons.themes.org/.
Многие пользователи используют по умолчанию шрифты в разрешением 75 dpi (точек на дюйм). Если вы установили шрифты с разрешением 100 точек на дюйм, убедитесь, что ваш файл XF86Config содержит эти шрифты в пути ДО шрифтов с разрешением 75 dpi. Вот пошаговая процедура как это сделать:
Первые шаги в aiohttp
Введение
Школа состояла из 6 лекций, шаг за шагом погружавших студентов в мир веб-разработки. На них были рассмотрены такие темы как сетевые протоколы, взаимодействие backend-а и frontend-а, компоненты веб-сервера и многое другое. Лейтмотивом курса было изучение асинхронного веб-программирования на Python, в частности изучение фреймворка aiohttp.
Для поступления на курс нужно было пройти комплексный тест на знания в области веба и python-а, так что студенты пришли учиться с хорошим начальным уровнем знаний. Однако, во время курса выяснилось, что не все темы даются одинаково легко. Самыми трудными для понимания темами стали:
Студенты задавали достаточно разные по уровню понимания вопросы, начиная от “Как создать отложенную задачу, используя только asyncio?” и заканчивая “Почему нельзя использовать Django для асинхронного программирования?” (имелась в виду полностью синхронная версия Django). В коде наши менторы тоже находили ошибки, связанные с недостаточным пониманием предмета, например, использование синхронного драйвера для базы данных в асинхронном проекте.
По результатам курса, я решил написать небольшой туториал, рассказывающий о создании базового aiohttp-сервиса с нуля и затрагивающий самые сложные для студентов вопросы: как сделать асинхронное python-приложение, как работать с базой данных и как разложить свой проект в интернете.
В цикле статей мы рассмотрим следующие темы:
Асинхронная работа с базой данных и автоматические миграции
Работа с HTML-шаблонами с помощью Jinja2
Размещение нашего приложения в Интернете с помощью сервиса Heroku
А также сигналы, обработку ошибок, работу с Docker’ом и многое другое.
Эта статья – первая из трех, и ее цель – помочь начинающим aiohttp-программистам написать первое “hello-world” приложение.
В этой статье мы напишем небольшое веб-приложение на aiohttp — стену с отзывами, где пользователь может оставить мнение о продукте.
Мы пройдем по шагам:
Создание проекта
Все команды в статье были выполнены в операционной системе OSX, но также должны работать в любой *NIX системе, например в Linux Ubuntu. Во время разработки я буду использовать Python 3.7.
Давайте создадим папку aiohttp_server, которая в дальнейшем будет называться корнем проекта. В ней создадим текстовый файл requirements.txt, который будет содержать все необходимые для работы приложения зависимости и их версии. Запишем в него следующие модули:
Создадим виртуальное окружение – что-то вроде песочницы, которое содержит приложение со своими библиотеками, обновление и изменение которых не затронет другие приложение, и установим в него наши зависимости:
После этого в начале строки терминала должна появится надпись (venv) — это означает что виртуальное окружение успешно активировано. Установим необходимые модули:
Структура проекта
Создадим в папке aiohttp_server следующую структуру:
Теперь откроем файл main.py и добавим в него следующее:
После предварительной настройки можно создать первый View.
Первый View
View — это некий вызываемый объект, который принимает на вход HTTP-запрос — Request и возвращает на пришедший запрос HTTP-ответ — Response.
Http-запрос содержит полезную информацию, например url запроса и его контекст, переданные пользователем данные и многое другое. В контексте запроса содержатся данные, которые мы или aiohttp добавили к этому запросу. Например, мы предварительно авторизовали пользователя — чтобы повторно не проверять авторизацию пользователя из базы во всех View и не дублировать код, мы можем добавить объект пользователя в контекст запроса. Тогда мы сможем получить нашего пользователя во View, например, так: request[‘user’].
В файле views.py в папке app/forum напишем следующий код:
Здесь создается функциональный View (function-based View). Определение “функциональный” означает, что код оформлен в виде функции, а не классом (в следующей части мы коснемся и class-based View).
Рассмотрим написанную функцию детальнее: функция обернута в декоратор @aiohttp_jinja2.template(«index.html») — этот декоратор передает возвращенное функцией значение в шаблонизатор Jinja2, а затем возвращает сгенерированную шаблонизатором html-страницу как http-ответ. В данном случае возвращенным значением будет словарь, значения которого подставляются в html-файл index.html.
Отдельно стоит заметить, что объект запроса request передается как аргумент функции index. Мы не используем request в этой функции, но будем использовать в дальнейшем.
HTTP-запрос отправляется на конкретный url-адрес. Для передачи HTTP-запроса в нужный View необходимо задать эту связь в приложении с помощью Route.
Первый Route
Route — это звено, связывающее адрес, по которому был отправлен запрос и код View, в котором этот запрос будет обработан. То есть, если пользователь перейдет в корень нашего сайта (по адресу /), то объект запроса будет передан в View index и оттуда же будет возвращен ответ. Подробней про Route можно прочитать тут.
В файл routes.py необходимо добавить следующий код:
Первый Template
Теперь нам осталось только добавить в templates/index.html код верстку нашей страницы. Его можно найти по этой ссылке.
Template — это html-шаблон, в который подставляются данные, полученные в результате обработки запроса. В примере в коде View отдается словарь с ключом title, шаблонизатор Jinja2 ищет в указанном html-шаблоне строки <
Запуск приложения
Мы создали первую версию нашего приложения! Осталось запустить его следующей командой в терминале (убедитесь, что находитесь в папке aiohttp_server):
Вы должны увидеть следующий текст в консоли. Он означает, что сервер запущен на порту 8080.
Давайте теперь посмотрим результаты нашей работы! Для этого перейдите по адресу http://0.0.0.0:8080 в браузере. Вы должны увидеть первую версию нашего приложения. При клике на кнопку “Отправить” должно возникнуть сообщение о том, что отзыв отправлен.
Поздравляю! Вы успешно создали первое приложение на aiohttp!
Заключение
В статье рассмотрено создание простого приложения на aiohttp, которое принимает запрос пользователя и отдает html-страницу. Мы затронули:
Настройку виртуального окружения
Базовую настройку проекта на aiohttp
Весь код статьи можно найти на гитхабе.
Пользуясь случаем, приглашаю всех читателей, интересующихся веб-разработкой, к нам на бесплатные занятия школу KTS. А для более опытных читателей сейчас идет запись на продвинутые курсы для backend-разработчиков, желающих повысить свои навыки в асинхронной веб-разработке. Всю информацию о всех школах можно найти на сайте, а также в нашем телеграм-чате.
Файлы шаблона
Как говорилось в разделе Основы, в минимальный набор файлов шаблона должны входить два файла: собственно шаблон .tpl и дескриптор шаблона .tdd. Остальные файлы предназначены для расширения функциональных возможностей шаблона.
Файл для описания шаблонов сайта
Куда помещать произвольные пользовательские файлы?
В принципе, файлы изображений можно поместить в следующие папки: templates, datafiles, xfiles или в любые другие созданные вами папки, в том числе, вложенные в папки, названные выше. Однако, лучше придерживаться описанных ниже правил по размещению файлов изображений, медиа-файлов, да и вообще любых произвольных файлов.
Папка templates
Не помещайте в папку templates файлы, относящиеся к контенту и файлы, предназначенные только для данного сайта, например, логотип сайта. Если вы решите скопировать всю папку templates для другого сайта, то вам придется заменять все такие файлы. Это, в обшем, не проблема, так как файлы придется заменять в любом случае, даже если они находятся в другой папке. Дело в другом — папкой temlates могут пользоваться другие сайты, о чем читайте ниже.
В папке templates (в также в ее подпапках) рекомендуется держать картинки, относящиеся только к общему дизайну сайта (фоны, элементы оформления).
datafiles — папка системных файловых данных
xfiles — папка произвольных файловых данных
Все файлы, загружаемые в ручном режиме и касающиеся только данного сайта, рекомендуется помещать именно сюда.
Естественно, загружать файлы можно с помощью FTP-клиента. Для упорядочивания данных, можно создавать подпапки.
Система никак не контролирует эти файлы, за исключением закачки файлов через текстовый редактор. При закачке файлов через текстовый редактор (как картинок), файлы попадают в корень папки xfiles. При этом производится переименовывание в латиницу, а при наличии в папке файла с таким же именем, производится приписывание к имени нового файла численного окончания.
Одна папка templates на нескольких сайтов
Несколько сайтов могут работать на одном комплекте шаблонов. Обычно такая ситуация возникает, когда делаются копии одного и того же сайта для разных городов.
Чтобы использовать шаблоны другого сайта необходимо:
На сайте-акцепторе во всех путях вида templates/. нужно заменить слово templates на методы Blox::info(‘templates’,’url’) или Blox::info(‘templates’,’dir’). Первый нужно использовать при создании URL, второй при указаниии абсолютных путей к файлам в файловой системе. Пример:
Когда вы делаете копию сайта, вы помимо всего прочего будете копировать и базу данных исходного сайта. Перед загрузкой базы данных на новый сайт, не поленитесь проверить ее на наличие строки «templates/», и замените его на соответствующий абсолютный URL сайта-донора.
Найден секретный способ освободить до 20 Гб памяти в телефоне
Существует несколько способов очистить систему Android от мусора и освободить таким образом память устройства. Это могут быть как встроенные сервисы, так и некоторые сторонние приложения для очистки. Но что делать, если ни один способ вам не помог и телефон все равно сигнализирует о нехватке памяти? В этом случае можно прибегнуть к ручной очистке и освободить таким образом до 20 Гб памяти смартфона.
Удаление папки Telegram
В 2021 году этот кроссплатформенный мессенджер по праву стал самым популярным приложением в мире, обогнав по числу скачиваний даже такого гиганта как Tik-Tok.
Но у Telegram есть одна небольшая проблема – вся просмотренная вами информация сохраняется во внутренней памяти телефона, тем самым засоряя систему.
Если вы являетесь активным пользователем Telegram, рекомендуем периодически очищать содержимое папки с приложением. Для этого достаточно перейти в любой файловый менеджер и полностью удалить папку Telegram. Не стоит переживать, с приложением после удаления ничего не случится. Система при следующем входе автоматически создаст папку Telegram заново.
Многим пользователям, которые делают такую процедуру впервые после установки Telegram, удается очистить таким образом от 1 до 10 Гб памяти. Проверьте и убедитесь сами.
Удаление папки.Thumbnails
Следующий способ – удаление папки, которая содержится в корневом разделе DCIM (или Pictures) системы Android и содержит в себе все мини копии картинок и фотографий, которые встречаются вам при серфинге в интернете и в приложениях. Этот раздел также может занимать очень большой объем данных, если ранее вы еще не проводили подобную очистку.
Папка.Thumbnails довольно хитрая и скрыта от глаз пользователя в каталогах системы. Чтобы ее найти и удалить, необходимо сначала включить отображение скрытых папок в настройках файлового менеджера.
В некоторых случаях системный файловый менеджер также не дает увидеть эту папку. В этом случае можно попробовать установить стороннее приложение, например ES-проводник, а затем перейти в каталог DCIM (Pictures), включить отображение скрытых папок и удалить папку.Thumbnails.
Если вы больше не хотите, чтобы миниатюры засоряли вам память устройства, можно немного перехитрить систему, создав в папке DCIM новый файл с другим расширением, но с тем же названием.Thumbnails.
Система Android устроена таким образом, что никогда не позволит создать два файла с одинаковым названием, поэтому папка.Thumbnails больше не сможет там появиться. Сделать это также можно с помощью ES-проводника.
Нажимаем на три точки в верхнем правом углу приложения → «+Создать» → Файл. Называем файл.Thumbnails (обязательно ставим точку вначале).
Готово! Теперь наш созданный файл не позволит системе Android создать папку.Thumbnails, а значит система больше не будет засоряться лишними миниатюрами.
Удаление папки Data
Еще одна папка, занимающая большое количество памяти в телефоне – папка Data, которая находится внутри каталога Android. Эта папка содержит кэш, а также некоторые настройки и служебную информацию о приложениях. Но каких-либо серьезных системных данных, влияющих на работу системы в целом, она не содержит. Поэтому ее также можно удалить, освободив до 10 Гб памяти.
Удалять ее нужно только в обход корзины, так как сама корзина является вложенной в папку Data, о чем система предупреждает при попытке удалить ее стандартным путем. Поэтому нам потребуется снова воспользоваться сторонним файловым менеджером, который позволит удалить папку Data напрямую, без промежуточных инстанций.
Открываем ES проводник и переходим во внутренний каталог системы. Затем переходим в папку Android→Выделяем папку Data→ Нажимаем Удалить. Убираем галочку с пункта «Перенести в корзину» и нажимаем ОК. Нам удалось очистить таким образом почти 3 Гб внутренней памяти.
Заключение
В далеком 1981 году на пути становления IBM, Билл Гейтс произнес, ставшую сегодня забавным мемом, фразу: «В будущем 640 Кб будет достаточно для каждого». Из-за особенностей первых процессоров, никто не мог и представить, что когда-нибудь в компьютерах, а тем более в мобильных устройствах удастся разместить большее количество памяти, а главное, что кому-то может понадобиться такой объем информации.
Несмотря на то, что сегодня любой смартфон обладает памятью в десятки тысяч раз, превышающий этот объем, нехватка памяти до сих пор остается актуальной проблемой, особенно для бюджетных моделей смартфонов. Мы надеемся, что с помощью нашей инструкции вам удастся очистить ваше устройство и наконец решить данную проблему.
Django tips & tricks
Приветствую!
В этом посте — небольшие советы по работе с Django, которые могут пригодиться начинающим разработчикам. Как я хотел бы знать это в начале моего пути освоения Django.
Рассматривать эти советы следует с долей критицизма. Буду рад, если вы найдёте неточности / лучшее решение, или предложите свои «фишки» для django, которых нет в документации.
Итак, начнём издалека, а уж потом перейдём к деталям.
Виртуальное окружение
Если вы не используете virtualenv для вашего django-приложения — то обязательно попробуйте.
Видимость / невидимость глобальных программ из virtualenv устанавливается отсутствуем / наличием файла [virtualenv]/lib/python*.*/no-global-site-packages.txt. Вот так просто.
Кстати, рекомендую всем статью про «изолированность» virtualenv: Why I hate virtualenv and pip (сайт тормозит, смог открыть только через web.archive.org). В ней рассматривается, насколько virtualenv действительно изолирован от «внешней» среды — если кратко, то это лишь частичная изоляция.
ipython
Структура проекта
Django по умолчанию при создании проекта или приложения создаёт необходимые каталоги. Но и самим нужно думать.
Как проект назовёшь, так и будешь импортировать
Называйте ваш проект project (django-admin.py startproject project) — ну или другим, но одинаковым именем для всех проектов. Раньше я называл проекты соответственно домену, но при повторном использовании приложений в других проектах приходилось менять пути импорта — то from supersite import utils, то from newsite import utils. Это путает и отвлекает. Если расширить этот совет — зафиксируйте (унифицируйте) для себя структуру каталогов всех ваших проектов и строго её придерживайтесь.
Куда сохранять html-шаблоны
Никогда, никогда не кидайте шаблоны (.html) в папку templates вашего приложения. Всегда создавайте дополнительный каталог с названием, совпадающим с именем приложения.
Вот это плохо, т.к. создаёт коллизию шаблонов, например, при <% include 'main.html' %>:
К слову, если вы используете <% include 'some_template.html' %>, то велика вероятность, что что-то не так. Почему?
Пример:
1) KISS едет лесом. С одной стороны, код страницы разбит на несколько — master.html и подключаемый slave.html, и это удобно для разделения больших html-страниц на части. Но в данном случае переменная var передаётся в шаблон slave.html неявно — var передатся в master.html, а slave.html просто «цепляет» контекст master’а. Таким образом, мы видим, что шаблон внутри <% include %>зависит от контекста основного шаблона. Мы вынуждены следить за контекстом родительского шаблона, иначе в дочерний может попасть что-нибудь не то.
2) По моим наблюдениям, <% include %>дорогой в плане рендеринга. Лучше его избегать.
Что делать? Если очень хочется одни шаблоны включать в другие — используйте inclusion tags (о них читать ниже). Но проще — просто пишите всё в одном файле:
settings.py
В settings.py пишем в начале:
Корень проекта
Задайте корень проекта в settings.py — это облегчит жизнь потом:
Контекстные процессоры (context_processors.py), <% include %>и inclusion tags
Используйте контекстные процессоры только если вам нужно добавить переменные в контекст каждой страницы сайта — ведь контекстные процессоры будут вызываться для любой страницы, даже если вы не воспользуйтесь их результатами. Лично я использую их для передачи номера телефона в контекст шаблона — этот номер реально на каждой странице выводится, и не единожды. Ещё пример — меню сайта. Я прописал заголовки и ссылки в контекстном процессоре, и если мне нужно будет добавить новый раздел в меню — я просто добавлю его в контекстный процессор, и он автоматически добавится везде на сайте.
Есть одна ошибка — использование контекстных процессоров для виджетов. Например, у вас на сайте есть колонка новостей, которая выводится всегда, т.е. на каждой страничке. Казалось бы, создать news/context_processors.py, и в контекст добавлять переменную news с новостями, а в шаблоне <% include 'news/news_widget.html' %>, или даже <% load news_widget %><% news_widget news %>…
Это работает, но это замусоривает контекст и, кроме того, кто знает, всегда ли у вас будет эта колонка. Выход есть — используйте inclusion tag. Вы просто пишете в шаблоне <% news %>, а уже этот templatetag ищет новости и вставляет колонку новостей. И работает он только тогда, когда вы его реально запускаете — т.е. пишете <% news %>в шаблоне.

Батарейки
django-debug-toolbar-template-timings
Все его знают и, наверно, используют. Но есть django-debug-toolbar-template-timings — плагин к debug toolbar, который замеряет время рендеринга шаблонов. А учитывая, что шаблоны django довольно «дорогие» (рендерятся долго), то для ускорения сайта этот плагин — то что доктор прописал.
adv_cache_tag
django-adv-cache-tag позволяет очень гибко управлять кешированием в шаблонах — версионность, сжатие, частичное кэширование. Просто оцените:
django-mail-templated
Шаблоны email писем — это то, чего не хватает django. django-mail-templated
django-ipware
Beautiful Soup
Не пишите свой парсер html. Не парсите html сами. Всё уже есть.
Templatetags, которые могут пригодиться
add_class
Если вы создаёте форму и хотите для каждого input-а задать стиль, класс или placeholder, то django заставит вас нарушить принципы и прописать все стили прямо в forms.py:
Данный фильтр добавляет класс к тегам, но можно переписать и добавлять любое свойство.
is_current_page
Иногда нужно что-то выводить в шаблоне, если открыта определённая страница. Например, подсветить кнопку «магазин» в меню, если пользователь сейчас в разделе магазина. Предлагаю следующий вариант:
Это фильтр, а не тэг, и причина тут одна: можно строить совершенно дичайшие конструкции с <% if %>. Например, если текущая страница — карточка товара, и при этом пользователь авторизован:
Есть и альтернативная, более точная, реализация, в которой используются аргументы (args или kwargs) для определения точной страницы (т.е. не просто «страница какого-либо товара», а «страница товара с >

Модели
Пустые
Модели могут быть пустыми. Вот так:
В данном случае Phrase является связующим звеном между PhraseEn и PhraseRu, хотя сама в себе ничего не содержит. Полезно, когда две модели равнозначны, и их необходимо связать в единое целое.
Generic relation mixin
Объекты GenericRelation всегда возвращаются QuerySet’ом, даже есть мы точно знаем, что объект один:
Если нужно получить доступ к токену, мы пишем registration.tokens.first(). Но мы-то знаем, что токен один, и хотим писать просто registration.token и получить сразу заветный токен. Это возможно при помощи mixin:
Теперь registration.token работает!
get_absolute_url
Старайтесь не писать <% url 'shop/product' %>.
Лучше для каждой модели задайте метод get_absolute_url(), и используйте << object.get_absolute_url >>. Заодно и ссылка «смотреть на сайте» появится в админке.
pre_save
В pre_save можно узнать, изменится ли модель после сохранения или нет. Цена — запрос к БД для получения старой записи из базы.
Формы
Этот паттерн уже был на хабре, но он слишком хорош, чтобы не упомянуть его.
На этом всё. Спасибо за внимание.
UPD. Как обычно на Хабре, в комментариях хабражители высказали свои мнения и предложили кучу замечательных идей, дополнений и замечаний к статье. Я не стал их вносить в статью, но вместо этого настоятельно рекомендую ознакомиться с комментариями к статье.