Django+FastCGI+nginx
Если django (да пожалуй и другие фреймфворки и не только на питоне) работает через fastcgi и проксируется nginx’ом по https, то последнему нужно добавить параметр:
fastcgi_param HTTPS on;
Если django (да пожалуй и другие фреймфворки и не только на питоне) работает через fastcgi и проксируется nginx’ом по https, то последнему нужно добавить параметр:
fastcgi_param HTTPS on;
И так, мы хотим, чтобы пользовал клацнув на кнопочку “Экспорт в Excel” получил это документ и был доволен. Что может проще скажете вы – взять положить файл в каталог и тупо его HTTP сервером отдавать. Но не все так просто в случае если вам необходимо, чтобы этот файл генерировался динамически (из-за меняющихся в нем данных), например django, на котором крутиться сайт.
Насколько мне удалось узнать, в мире существует один адеватный генератор Excel файлов – xlwt, который можно юзать на Unix системах. Это клон pyExcelator’a, но лучше подходит для django и сохранения не в файл. С документацией у него беда, но парочку линков все же нашел: обзор и пример.
Кроме того, примеры есть и в тарболе с pyexcelator’ом или в самом xlwt.
И так создаем во views.py приложения django функцию, которая будет возрвращать xls файл:
Но это еще не все. Далее нам нужно этот документ каким-то образом передать пользователю. Отсюда вытекают 2 проблемы или вопроса:
Начну пожалуй со второй проблемы, ибо она решается довольно просто. Если залезть в RFC 2183, то можно узнать про интересное поле в HTTP заголовке – Content-Disposition, которое то и позволит присвоить имя файлу через присвоение ему типа attachment с параметром filename. Для Django это будет выглядеть так:
И так, для решения первой проблемы (в случае если используется pyExcelator) я порылся в коде pyExcelator’a и выкопал следующее. Оказывается метод save() класса Workbook делает следующее:
CompoundDoc.XlsDoc() собственно и представляет собой обертку над бинарными данными, который сгенерировал Workbook (их получаем с помощью self.get_biff_data()). Как раз после save() класса CompoundDoc.XlsDoc() и получаем конечный Excel документ. Но смотрим далее в метод save() этого XlsDoc‘a:
Как видно, опять, тут идет работа с файлов. Слава богу это конечный пункт сохранения файла, поэтому смело овверайдим эти два класса для работы с Django:
Вставляем этот код в views.py нашего приложения и в коде нашей функции export_xls() после создания и генерации данных пишем:
Здесь wb – это WoorBook из первого листинга (но это не тот Workbook, что из pyExcelator’a, а наш, который мы переопределили).
Вот собственно и все. Небольшая компиляция собранных с краев интернета кусочков. Может и есть какой-то более прямой способ.
UPD В случае использования xlwt все проще. Юзаем:
Чтобы сплитнуть репозитарий или, например, вытащить какую-нибудь поддиректорию в корень нового репозитария в делаем:
В этой же директории где лежит и старый репозитарий old_repo, который требуется разделить.
Т.е. игнорируем все файлы из old_repo, переименовываем subdir в “.”, чтобы эта директория стала корнем new_repo и включаем ее в копирование
Собственна все, далее можно из old_repo удалять subdir:
Posted on 11 July '08 by spoof, under devel. No Comments.
Posted on 18 June '08 by spoof, under devel. No Comments.
Два дня минус почти просто так. Были потрачены они на поиск баги в моем питоньем скрипте, который р аботает с MySQL. Работа эта заключается в получении данных и распихивании их по словарикам (питоний). Так вот, было замечено, что для двух одинаковых значений ключа создается 2 записи в словаре (какого ху…дожника?!). При более внимательном рассмотрении было выяснено, что эти два якобы одинаковых ключа на самом деле разные, а разные они в регистре одной буквы. При запросе из MySQL возвращалось 2 значения вместо одного – отсюда возникали глюки. А все потому, что MySQL по-дефолту при сравнении строк не учитывает регистр, если не указаны collations для поля/таблицы в *_bin или *_cs. Век живи – век учись. Это конечно должно было известно быть – оно мне и было известно, но я об этом успешно давно забыл, ибо уже не помню когда последний раз с этим сталкивался. Взято отсюда
Posted on 21 April '08 by spoof, under devel. No Comments.
Похакал немного текущую тему для блога. Прикрутил к ней сайдбар с виджетами и подогнал к общей стилистике. Вроде ничотак, а вы как думаете? Но немного жаль потраченного часа – слишком уж много заморочек с CSS. Благо Inspector в Safari сильно помогает в разборе.
Posted on 10 April '08 by spoof, under blog, devel. No Comments.
Posted on 8 April '08 by spoof, under comp, devel, заметки. No Comments.
Если вы программист, или какое-то отношение к ним имеете, то вы наверно встречали индусов, а точнее “индусов”. А именно тех еб^Wнехороших людей, которые пишут совершенно отвратный код. Так о чем это я. Короче, устал я от ковыряния кривоработающих компонентов своих проектов – будь это что-то рабочее или “быдлокодерское” (фрилансерское). А устал именно от того, что эти компоненты написаны тяп ляп и постоянно убиваешь кучу времени на то, что фиксишь баги в этих компонентах или адаптируешь их под себя. Я бы сказал немеряно времени, бывает, что сильно больше, чем реализация чего-то непосредственно касамеого самого проекта.
(more…)
Finally, поборол свою лень и занялся сайтами, в том числе и своим блогом. К своему блогу прикрутил categories cloud widget (уж очень нравицца) и плагин del.isio.us, который стягивает последние ссылки с моего аккаунта на одноименном сайте. Widget…слово то какое. Короче это новая фича, которая идет в 2.2 и была доступна в качестве плагина для wordress’a версий ниже. Если у Modx это называется snippet, у Joomla – модуль/компонент, то тут это те же яйца, только вид сбоку. Хотя это грамотное решение проблемы постоянной правки шаблонов/templates дизайна – тупо перетащил нужный widget в понравившееся место на sidebar’e (жаль, что только на sidebar’e) и юзаешь на здоровье и никакой правки шаблона.
Вот бы таким же образом сделали openid “авторизацию”, чтобы возможно было комментировать. Сейчас же опять надо менять это в шаблоне. Шаблон, кстати тоже поменял, но это временно, ибо он мне не нравится, но лучше ничего не нашел.
Продолжил работу над сайтом Ragga-Jungle.Ru. Первоначально задумывалось сделать это всё на движке Joomla, но оказалось, что это настолько запутанная CMS, что возникает вопрос : что курили разработчики этой cms, когда ее создавали? Я знаю, что корни идут от Mambo, но тем не менее.
Короче, вернулся на Modx, который показался мне наиболее удобным и понятным для создания того, что требуется. Переход правда связан с потерей интеграции всех модулей друг с другом. Надо пилить руками – но хотя бы понятно, что куда и зачем. Modx однозначно рулит! За 2 дня я сделал больше, чем за неделю (если быть точным за два вечера против пяти вечеров).
И еще.. Cи++ постепенно съедает мой моск и время
upd: Таки пришлось мне править шаблон руками. Ссылка home была битая и вела на текущую страницу всё время. В коде надо было заменить $url = get_option(’wpurl’) на $url = get_bloginfo(’url’); Видимо это wordpress 2.x specific “фича”.
Закончились 2 достаточно сложных недели, в течение которых было очень очень мало свободного времени. Подведу небольшой итог:
Решение отсюда помогло.
Copyright 2010 by Spoof's blog.
Design by My Web Caffe