Чтиво на выходные 19-20 мая

Django

Добрые люди выкачали все видеозаписи с последнийх PyCon и сделали торрент-раздачи: PyCon US 2011 Atlanta и 2012 Santa Clara. Есть также торрент на PyCon 2012 Santa Clara рутрекере. Спасибо Михаилу Феоктистову и Михаилу @mktums.

Неплохая обзорная статья про варианты кеширования в Django. Рассмотрены как готовые решения, так и общие рецепты для собственных решений.

Подробный разбор безопасности Django в отличной презентации ”Case Study of Django: Web Frameworks that are Secure by Default”


WebDev

Инструмент для экспорта слоев Фотошопа в css. Обещают скорый релиз.

Мультиаплоад файлов, версия N

Еще с давних времен, когда интернет был молодым и медленным, самым распространенным браузером был не IE, а Mosaic, в интернет не ходили, а дозванивались… меня часто мучал вопрос — почему в файловых диалогах можно выбрать всего один файл? Почему если в форме есть три файловых поля, то в каждое из них надо тыкать? Неужели нельзя удобнее?
Шло время, появился javascript, CGI, но файлополя были все также эгоистичны. Потом появился флеш, html5, ситуация начала меняться, но… Файловое поле имеет ту-же самую суть — файл, а не файлы! Хотя есть множество обходных методов…
Читать дальше →

[Из песочницы] Пишем модуль для авторизации в VK API

На днях возникла необходимость сохранить все фотографии из своего фотоальбома ВКонтакте на жесткий диск. Естественно, вариант, с сохранением фотографий по одной, меня не устроил. Тут вспомнилось, что у ВКонтакте есть API. Пять минут чтения мануалов, и все нужные функции найдены. Единственная проблема – не существует нормального способа, для получения доступа к API. В документации сказано следующее:
Процесс авторизации приложения состоит из 3-х шагов:
  1. Открытие окна браузера для аутентификации пользователя на сайте ВКонтакте.
  2. Разрешение пользователем доступа к своим данным.
  3. Передача в приложение ключа access_token для доступа к API.


На первый взгляд, набросать простенький портабельный скрипт не получится. Хотя, что мешает нам притвориться браузером?

[Перевод] Я неправильно работаю с HTTP

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

Главная проблема в том, что я никогда не добавлял достаточно абстракций в свои HTTP-библиотеки.
Объекты запроса и ответа (request и response) практически не скрывают деталей HTTP. Я имею в виду, что вы не можете просто сериализовать эти объекты и ожидать что все будут работать. Сериализация возможно работает для response объектов в werkzeug (веб фреймворк автора) и других библиотеках и фреймворках. Если вы хорошо знаете внутренности своей библиотеки, то вы возможно сможете сериализовать и Request объект.
Но главное, что это не было предусмотрено при проектировании этих фреймворков — все они тонкие обертки над внешними ресурсами — над TCP соединением с браузером.
Читать дальше →

Делаем бэкап музыкальной базы vkontakte с помощью Python

Год назад я захотел в машину флешку с винегретом из музыки, которая была у меня в плейлисте контакта. А там, к слову, почти 1400 треков.

Итак, первое, что я сделал — октрыл список расширений оперы и набрал в поиске «vkontakte». Но вот оказия, все приложения предлагали качать по одному треку, в основном добавляя рядом с ним кнопочку «скачать». В принципе, это удобно, если надо стянуть оттуда один-два трека, но вот если их 1400…

Следующий моим шагом было открытие страницы с музыкой и внимательная медитация над ней, с целью распарсить страницу, выдрав оттуда ссылки и названия. Слегка подумав, я решил, а почему бы снова не использовать вконтактовый API? Ведь опыт использования у меня уже есть (писал десктопный плеер на Qt). Но лепить полноценное приложение, тем более на плюсах или каком-либо другом языке, мне показалось слегка не умным решением. И тут я подумал — черт возьми, есть же python, наклепаю скрипт и стяну все. Итак, выбор сделан, начинаем кодить.

Еще о кэшировании в Django

Все знают, что такое кэширование и зачем оно нужно. Посещаемость растет, нагрузка на базу данных увеличивается, и мы решаем отдавать данные из кэша. В идеальном мире, наверное, для этого будет достаточно добавить строчку USE_CACHE = True в settings.py, но пока это время не пришло, понадобится немного больше телодвижений.

Когда мы собираемся использовать кэш в Django, нужно сделать выбор: взять готовое решение, которое сделает сделает все «за кулисами», либо реализовать свое. В отличие от многих других ситуаций, тут этот выбор не так очевиден, так как в существующих на сегодня готовых решениях довольно много ограничений и потенциальных неудобств.

Сначала мы быстро рассмотрим готовые решения, а потом разберемся, как же лучше реализовать кэширование самостоятельно.
Читать дальше →

Link Roundup #3

Разработка

  • Что-то пошла мода на "легковесные" очереди задач. Недавно Vincent Driessen опубликовал свой RQ, а теперь вот и David Cramer пишет, что они в DISCUS пришли к чему-то подобному.
  • На Highscalability появилась ссылка на новую статью про Paxos. Говорят, там всё хорошо расписано, и обсуждаются детали реализации.
  • Про то, что масштабируемые сервисы нужно разделять переборками, чтобы повысить их плавучесть.
  • MailCatcher — простой SMTP сервер, для отладки отправки писем. Перехватывает все проходящие через него сообщения, и показывает из в веб-интерфейсе. Попробовал swiftypy.com — поис

Опциональная типизация в динамических языках

12 мая я выступил на конференции ADD-3 с докладом об опциональной типизации в динамических языках. Вот слайды доклада (HTML, требуется нормальный браузер) и его аннотация:

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

В докладе рассматривается получающая распространение опциональная типизация, которая поможет сгладить недостатки динамических языков. Описываются способы введения опциональной типизации в динамические языки на примере языков Python, Erlang, Dart. Рассматривается, как применяется опциональная

Чтиво на воскресенье 13 мая

Django + Python

Продолжаем делиться опенсорсом: django-future-url от Виталия Олевинского. Как без особых проблем сделать все теги {% url %} совместимыми с будущими версиями Django.

Ребята из dabapps рассказывают про свой подход к работе с ORM: заменяйте низкоуровневые вызовы кастомными Queryset-менеджерами. У себя в студии мы делаем примерно то же самое.

Несколько полезных ссылочек, которые были озвучены на Moscow Django Meetup (timepad, facebook).
Достойная альтернатива Django Compressor — django-gears.
С документацией Class Based Generic Views дела обстоят не очень хорошо, http://ccbv.co.uk/ отличный п

Moscow Django Meetup #3



Хотим поделиться впечатлениями от третьей московской встречи Django-девелоперов, она же Moscow Django Meetup. Благодаря организаторам из GreenfieldProject и Seven Quark в этот раз удалось подыскать для встречи отличное место: один из вместительных залов MOD Design. Очень уютное, близко к центру, а главное, всем хватило места и было удобно. Огромный проекционный экран, кликер для докладчика, вкусный кофе в перерыве, что ещё надо для хорошего митапа.

Презентации на SlideShare
Группа Moscow Django в Facebook
События на timepad

В прогр

Обновления

О разделе «Блоги»

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

Тэги

2010 admin advertising ajax and android apache api app engine aptana async asynchronous authentication autocomplete bash bencode blender blog blogengine blogs book bootstrap bot breadcrumbs c c++ cache cbv celery ci cidr class based views cli cms code code-fu coding comet conference configparser continuous integration coverage c plus plus cpython crud css ctypes curl custom model fields cx_oracle datetime db decorator decorators deploy deployment dev devconf developers development diagram diofant django django advent django-cms django days django framework django-hosts django-piston django social auth django template django trunk django weblog documentation ds19b20 eclipse emacs encoding environment epoll erlang event events extjs fabric facebook fixtures flash flask float formalchemy fp freelance freeswitch fs2web ftp gae games generic views gil git github go google google app engine grab grablab graphviz greenlet gui gwt haml haproxy haskell hg highload host howto html http i18n ide import inet java javascript jenkins jetbrains jinja jinja2 jit job jquery js json jython kde kindle kqueue kyivpy libs life lighttpd links linux logging lxml magic mako mapperextension math matplotlib meetup memcached mikrotik minify mixin mkd model models mongodb moscowdjango meetup multiprocessing musicmans.ru must have mvc mysql .net netcdf networkx newforms newforms-admin nginx node.js nosql numpy odessa offtopic opensource open source oracle orm os parsing paster path pep performance optimization perl pgfouine php pil pip plasma plone plugin postgres postgresql programming py py2app py2exe pycharm pycon pycow pycurl pygtk pylons pypy pyqt pyqt4 pyrrd pyside python python 2.7 python3 python 3 python c api python speed pywin32 qt queue recipes redirect redis redsolution redsolution cms repoze repoze.who rest reusable apps routes rrd rrdtool rss ru ruby sample sass scraping search selenium seo setattr settings signal snmp social network socket.io south sphinx spider sql sqlalchemy sqlite step-by-step subdomain subversion system sython tdd tddspry template templates templatetags testing threading threads tips tips and tricks tmbu tools tornadio tornado tornado server torrent tricks tutorial tweepy twisted twitter uapycon ubuntu uml uncategorized unicode unittest upload utf-8 uwsgi validation vim virtualenv voip web web development webkit what who widgets win api windows wirbel work wrapper wsgi wtform wxpython wxwidgets xml xmpp xpath yandex yandexmap youtube zip администрирование django алгоритмы архитектура базы данных безопасность без рубрики блог бред будни вакансии введение веб-разработка видео вконтакте гениальность графы данных декоратор декораторы дескриптор дескрипторы заметки идиотизм избранное интернет информационная безопасность клиентам клиентская часть командная строка консоль конференция личное масштабируемость математика модели qt модули мысли нейронные сети новости оптимизация оптимизация кода основная лента парсинг парсинг сайтов перевод песочница питон планы полезности правила кодирования прогнозирование программирование разное разработка разработка приложений рецепты скрипт события сортировки ссылки статьи структуры структуры данных тестирование тесты убунтариум фигня хабрахабр частота слов частотный анализ чтиво шаблон шаблонизация шаблоны проектирования юмор я пиарюсь