Показаны сообщения с ярлыком django. Показать все сообщения
Показаны сообщения с ярлыком django. Показать все сообщения

Переезд 3.0: Цифровой Океан (Digital Ocean)

Некоторое время назад на домашнем сервере был поднят сайт. Долго ли, коротко ли, постепенно сайт проиндексировался и Яндексом, и Гуглом и даже всевозможными заморскими Бингами и Асками, так что на сайт стали захаживать посетители. Не то что бы много,- пара сотен в день. Всё хорошо,- и постоянный адрес от провайдера домашнего интернета пожалован, и канал не то, чтобы тонкий,- но временами серверу стало плохеть временами, да так, что не только ssh отваливался, а и перезагружать стало надобно, да аж по питанию.

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

Вообщем,- выбран был самый простой тариф, да ось знакомая, да времени на развёртывание ушло около минуты. Удобный интерфейс, моментальное развёртывание образов,- рекомендую всем.

И да, вы можете прямо сейчас зарегистрироваться на Digital Ocean и получить скидку на 10$ 

Система визуализации статистики Graphite: Общие сведения

Организовать сбор статистики,- это не просто, а очень просто. Надо только сначала определиться,- нужна ли именно статистика, или душа мечтает о волшебном аналитическом инструменте уровня Business Intelligence. Различия систем таких классов следующие: статистика,- это сбор, хранение и отображение значений заранее известных метрик заранее определённым способом, а BI,- это скорее поиск и извлечение значений и зависимостей из необработанных наборов данных по заранее неизвестным критериям.

Python: property object вместо значения

Не раз уже бывало, что при разработке на Python в какой-то части кода вместо значения интересующей переменной в дебаг-лог попадает сообщение вроде этого:
INFO src.wiki.views views.dispatch:123 'content': '<property object at 0x10ae22f70>'
То, что у получение значения content в этом классе реализовано через property,- и так понятно, но почему вылезает этот самый самый загадочный property object вместо значения? Всё не просто, а очень просто: во всех этих случаях была попытка получить значение из функции, обёрнутой в @property, но не из экземпляра класса, а из самого класса.

Такое происходит из-за того, что в Python всё является объектами, даже классы. Запрашивая свойство (property) у класса вместо экземпляра,- получаем запрошенное, но это не значение,- а сам метод, вложенный в объект property.

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

Python: наследование и логирование

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

Промежуточные итоги

Смотрю статистику в Google Analitycs,- оказывается пропустил маленькое, но гордое событие: суточная посещаемость на сайте доросла до отметки 100+. В основном поисковый трафик, но есть и около 10% ссылочного трафика. Народ ищет разное, в основном про МультиФон, но есть и эcтеты, которых интересует обжим (распиновка) E1. В лидерах ключевых слов поискового трафика, как ни странно, не МультиФон, а PyScripter,- неплохой редактор (почти IDE ;-) для языка Python. Однако, для рефакторинга PyScripter не очень подходит, в последнее время начал иногда использовать IDE Eclipse с установленным PyDev. Если бы не лишний вес, пользовался бы эклипсом, хотя с рефакторингом там тоже не всегда всё хорошо. Но зато Eclipse c PyDev понимает проекты для Django.

ef bb bf - ползёт разметка в Django

Столкнулся с необъяснимым на первый взгляд явлением,- на одной из страниц Django'вского приложения необъяснимо разваливалась разметка страницы. Только на одной. Смотрю исходник страницы,- на первый взгляд всё в порядке, только какая-то чёрточка странная и посторонняя в самом начале HTML кода. Причём эта самая необъяснимая чёрточка видна далеко не во всех редакторах. В попытке вяснить причину добрался аж до просмотра в HEX,- оказалось, что там целые 3 байта EF BB BF, а не чёрточка. Остальное дело техники: эти байты,- признак ByteOrderMark. Осталось просмотреть все шаблоны, из которых генерируется страница, поскольку BOM может быть в любом из файлов, даже вложенном. У меня оказалось, что BOM присутствует в файле шаблона аж на третьем уровне вложенности шаблонов. Не забывайте проверять, в каком формате сохраняете файлы

Внешние скрипты для проекта Django

Несколько раз сталкивался с ситуацией, когда удобнее использовать скрипт вне методов проекта models-views. При этом хочется использовать объявленные в models классы. При написании такого скрипта "в лоб", пытливый программисткий ум обычно лицезреет ошибку:

ImportError: Settings cannot be imported, because environment variable DJANGO_SETTINGS_MODULE is undefined.

Простой и не всегда удобный вариант,- добавить DJANGO_SETTINGS_MODULE в переменные окружения командной строки (умолчания для cmd.exe,- если в Windows или export в Linux\Unix). Ещё более короткий и переносимый способ,- сделать всё необходимое непосредственно в скрипте:

import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'

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

Менеджер: перезагрузка

Долго искал блуждающую багу в приложении на django: в какой-то момент функция get_object_or_404 начала выдавать ошибку AttributeError: 'list' object has no attribute 'model'. В принципе понятно, что где-то вместо модели вылезает список (list), но где и почему,- непонятно. Гугление результатов не дало,- конкретно такой ошибки, похоже, ни у кого не возникало, поэтому пришлось копаться до тех пор, пока не снизошло озарение. Оказалось всё просто: get_object_or_404() неявно вызывает метод all() стандартного менеджера моделей models.Manager. А у меня хватило ума переопределить этот метод в свойм кастомном менеджере, и не просто переопределить,- у меня он выполнял совсем другие задачи. Переименование метода в get_all() вернуло всё на своё место.

Полный список методов, которые не надо случайно переопределять, можно посмотреть в онлайн-трекере Django, начиная со строки class Manager(object):