четверг, 18 июля 2013 г.

Классическая проблема верстки - выравнивание блоков

Часто встречается ситуация, когда некий контейнер "набивается" float-ом дочерними элементами . На макете все красиво и ровно. На практике, после того как начинается работа с реальным контентом (например содержимое категории товаров в магазине), то однотипные блоки получаются разными по высоте. Проблему можно решить принудительным транкейтом содержимого, подбором "максимальной" фиксированной высоты или javascript-ом. Пример кода, решающего подобную проблему (используется jQuery):

//делаем высоту всех .thumbnail одинаковой
   var  max_height = 0;
 $('.thumbnail').each(function(){
    h = $(this).height();
   if(h > max_height){
     max_height = h;
    };
   });
 $('.thumbnail').css('height',max_height);

Этот код хорошо отработает , например , в IE, а вот Chrome могут быть проблемы, если в .thumnail внутри есть изображение. На момент вычисления height оно еще может быть не загруженным и поэтому полученные величины height и width могут очень удивить верстальщика :) Поэтому код надо модифицировать , например, вот так:

$(document).ready(function(){
//делаем высоту всех .thumbnail одинаковой только после полной загрузки всей страницы
   var  max_height = 0;
 $('.thumbnail').each(function(){
    h = $(this).height();
   if(h > max_height){
     max_height = h;
    };
   });
 $('.thumbnail').css('height',max_height);
});

вторник, 9 июля 2013 г.

Unable to find vcvarsall.bat

Часто при установке некоторых python-библиотек (PIL, django-imagestore .. ) под windows возникает ошибка:

Unable to find vcvarsall.bat

Причина отсутствии или невозможности при установке найти нужный Сишный компилятор, который как правило есть  в поставке MS VS.

Для решения проблемы совсем необязательно ставить "студию". Можно обойтись компилятором mingw:


  1. качаем отсюда и ставим
  2. скачиваем нужную python - библиотеку и выполняем для ее setup.py :

setup.py install build --compiler=mingw32

Перед этим не забудьте прописать путь к mingw32.exe в PATH (например C:\mingw\bin)

четверг, 4 июля 2013 г.

django-rest-framework - некоторые особенности

Как и обещал ранее дамплю все грабли и особенности , которые возникают в ходе освоения этого фреймфорка.

Сразу отмечу, что авторы этого приложения большие молодцы - документация на фреймворк сделана в виде пошагового туториала - фактически онлайн учебника. На первых шагах все делается стандартными механизмами. И дальше, по мере продвижения, авторы упрощают код с помощью многочисленных "плюшек" , которые предоставляет их приложение. Советую для лучшего понимания и во избежание последующего недопонимания :) именно так и поступать, а не копипастить конечные синтаксические конструкции.
Хотя при этом могут и проблемы возникнуть . Например, на одном из шагов авторы предлагают реализовать rest-вьюхи  как обычные function-based django views, сопровождая их декоратором api_view. Этот шаг - исключение и его лучше пропустить, сразу перейдя к class based views , иначе возникнет ошибка:

Cannot apply DjangoModelPermissions on a view that does not have `.model` or `.queryset` property.
Но и после перехода в class-based views не забываем указывать model или queryset в полях вьюшного класса.

Unicode

Для того, чтобы в отдаваемом REST-ом контенте корректно отображался Unicode необходимо в settings явно прописать UnicodeJSONRenderer.
Например:

REST_FRAMEWORK = {
 
    'DEFAULT_RENDERER_CLASSES': (
        'rest_framework.renderers.UnicodeJSONRenderer',
    )
}


Выбор решения для организации API на django-сайте

Возникла задача в одном из моих django-проектов предоставить API для взаимодействия с некоей внешней системой.
Первоначальный выбор пал на django-piston. Реализовать операции read-доступа к объектам БД удалось довольно быстро, но вот с операцией создания объекта начались проблемы, частично решив которые и получив новые , решил выбрать другое решение.. Уж больно надоело патчить чужую библиотеку.
Другое решение - это Django Rest Framework. Знакомство с отзывами и документацией обещает менее нервную разработку. К непосредственной попытке использования приступлю на днях.
Постараюсь не забыть задокументировать здесь все особенности и подводные камни, если таковые найдутся :)