Посты с тегом веб (44)

Чем ходить по http?

Как оказалось в питоне нет однозначно подходящего варианта. Всего-то хочется удобно дергать какие-то API и иногда стягивать файлы.

Есть несколько библиотек, многие из которых друг друга используют и заимствуют функционал. Но вот чего-то одного, удовлетворяющего достаточно простым (ведь так?) требованиями, нет.

Требования же эти такие:

  • поддержка http/https
  • возможность использовать любые http verb
  • возможность отослать body запроса с произвольным Content-Type
  • поддержание коннекта между запросами (keep-alive)
  • работа с куками
  • стандартная аутентификация
  • file-like интерфейс к body ответа
  • кеширование
  • conditional get
  • обработка низкоуровневых ошибок и оборачивание их в какой-то дженериковый HTTPError и наследников.
  • возможность добавить в конвейер запроса хуки, чтобы можно было какие-то действия производить с отсылаемыми данными, либо результатом.
  • возможность задать таймаут хотя бы для соединения

Ну и пара экзотических хотелок:

  • поддержка http pipelinening
  • возможность делать запросы асинхронно

Ведь не невозможного хочется. Но что мы имеем.

httplib

По сути основа всех питонячих "ходилок" по http. Находится в стандартной библиотеке. Главная особенность -- позволяет присоединиться к http серверу и делать запроса к его урлам в рамках одного соединения.

connection = httplib.HTTPConnection('example.com')
result = connection.request('GET', '/foo')
# ...
result = connection.request('GET', '/bar')
# ...
connection.close()

Возвращает file-like объект и с недавних пор позволяет задать таймаут для соединения. Тут фичи заканчиваются и мы остаемся наедине ...

Бойтесь lxml, html парсящий

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

u'\xd0\x9a\xd1\x83\xd1\x80\xd1\x83\xd0\xbc\xd0\xbe\xd1\x87'

Вы заметили что что-то не так? И я вот. Строчки как бы уникодные, но внутри них закодированные utf-8 байты. Что-то pдесь не так. Разбираясь дальше и потребовав скрипт, которые такое генерирует, становится понятно, что данные берутся из веба. Вполне обычным способом через urllib и потом скармливаются в lxml.html для разбора. Поскольку urllib оперирует только байтовыми строками, то он не мог их так превратить в уникод, а значит во всем виноват lxml.

Вообще lxml очень крутая библиотека - и быстрая, и функциональная, и умеет мимикрировать интерфейсом под ElementTree, и взаимодействовать с BeatifulSoup. Она давно уже пользуется популярностью у питонистов, когда надо как-то удобно работать с xml.

Но тут немного другой случай. Тут используется парсер html. И именно в нем происходят эти неприятные метаморфозы со строками.

Я решил понять в чем же всё-таки и дело и как побороть такое поведение.

Для начала, я сходил на http://yandex.ru/ и посмотрел что за html там отдается. Кодировка контента utf8. Сразу что бросилось в глаза -- это ...

NoSQL: Нереляционные хранилища

Пора нарушить молчание и рассказать о том, что на недавней замечательной конференции 404fest я тоже имел честь выступать с докладом. Посвящен он был модной ныне теме - NoSQL. Доклад получился коротким и поэтому больше политическим чем техническим. Я хотел показать, что этот новый тренд не просто так захватывает умы всё большего числа разработчиков.

Это только первое моё выступление на эту тему, но, я надеюсь, что в скором времени последуют другие на новых площадках


View more documents from Alex Koshelev.

Update: а вот и видео подоспело:

Не надо больше таких сайтов!

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

Сейчас я хочу немного порассуждать про сайты-сообщества, например Питона, Джанги или любой другой любимой вами технологии/языка. Это очень похвально, что люди готовы только на энтузиазме (ну или почти только на нем) продвигать продукт, которым они пользуются. Но зачем это делать "как все" и совершенно неэффективно, наступая на всё те же грабли из раза в раз?

Сто есть на каждом сайте какого-либо сообщества?. Агрегатор блогов - так называемая "планета". Но многие уже разочаровались в таком способе в одной ленте получать записи из разных источников. Главная проблема - это автоматическая суть таких агрегаторов. Т.е. авторы чьи блоги входят в эту ленту могут вдруг начать писать что-то совсем отвлеченное или банально неинтересное и что делать? Отписываться от планеты целиком? Не очень удобно, но нет выбора, если кто-то действительно в неё "спамит" и захламляет ваш ридер.

Как показывает практика, гораздо лучше ручные агрегаторы. Все наверно читают Саймона Виллисона и регулярно ходят по интересным ссылкам на какие-то статьи или проекты из его постов. Такого уровня качества ...

Сливаемся

Беру небольшую передышку в своих изысканиях о композитных полях для большего прилива вдохновения. Подамся-ка я в другую область на время.

Представим себе ситуацию(а лучше вспомним один из прошлых проектов, который вы делали:)), что есть пара приложений от сторонних разработчиков. И это не какие-то совсем простые приложения, а что-то более комплексное. А отличительной чертой их комплексности будет наличие в каждом своей модели профиля. Ведь было такое? Увы, было. Ну и пусть будут, только вот ещё незадача - их поля являются пересекающимися множествами. Ну т.е. и в том и в другом есть, допустим, поле с ссылкой на сайт владельца. И что же делать? Конечно, для облегчения работы интерфейс редактирования информации профиля один для выбранного основного профиля. А объектов профиля закрепленных за пользователем два (а может быть и больше, если проект используем много разных приложений). Надо как-то синхронизировать данные...

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

Кстати, обсуждения данной темы были как на неформальной встрече джангистов по поводу ...