uscr 01.08.2012 15:08
Мой OpenSource проект — Сокращатель ссылок.
Вступление
Здравстувйте! Давно уже меня мучал вопрос: "да как же на этом самом питоне пишутся сайты?!". Нет, я знал про django и знал даже о том, что документация переводится на русский, но попробовать руки всё не доходили. Однажды мне приспичило сократить неприлично длинную ссылку на корпоративную вики. Гугл пнул меня на сокращатель ссылок, который отказал мне по той причине, что не смог получить доступа к ресурсу. Да, потом я нашёл сокращатель, который без вопросов сократил ссылку "как есть", но мысль уже появилась. Цели создания своего велосипеда были следующими:
- Познакомиться с джангой
- Узнать, что такое css, что бы с умным видом рассуждать о табличной и блочной верстках.
Поэтому, принимается критика по коду, но не по функционалу.
Брифинг
Итак, перейдя по адресу cutcut.ru можно невозбранно ввести любой текст (длинее 9 и короче 1001 символа) и получить сокращённую ссылку. "Любой текст" - это действительно любой текст. Парсер определит, была ли введена ссылка или простой текст. У парсера бывают проблемы с детектером ссылок, потому как я не смог нагуглить адекватную регулярку, а самому думать было лень, то ссылка детектится такой регуляркой: (www.|http:\/\/|https:\/\/|^)[\w\s\-\/\._]+\.{1}[a-zA-z]{2,3}($|\/), а она не совершенна. Если вы ввели ссылку, то при переходе по сокращённой ссылке случится редирект, если простой текст - отобразится страница с введённым текстом. Имеются пасхалки:
Попытайтесь сократить слово "фонтан". Пасхалка сворована с некоего ресурса со смешными картинками, о котором нет нужды говорить.
Нажмите кнопку "Обрежь!" не вводя в форму ничего (это скорее не пасхалка, а обработка ошибки, да).
Нажмите кнопку "Обрежь!" не вводя в форму ничего (это скорее не пасхалка, а обработка ошибки, да).
Под капотом
После ввода строки в форму она проходит тучу if'ов, дабы отсечь слишком короткие, слишком длинные и т.д. строки. Далее попытка задедектить ссылку. Если ссылка определилась, к ней дописывается http:// (если ещё нет) и меняется значение переменной, определяющей тип записи. Теперь вычисляется md5 от строки. Если такая строка уже есть в базе, пользователю отдаётся уже существующая ссылка. Если в базе строка не нашлась - создаётся запись. Теперь от записи берётся id в базе, по нему вычисляется идентификатор (hex(rec.id)[2:]) и запись апдейтится, к ней дописывается идентификатор, а пользователю отдаётся ссылка вида: cutcut.ru/a/id.
При переходе по ссылке id ищется в базе. Если находится, то из базы дёргается вся информация о записи. Если ссылка - редирект. Если простой текст - отображается текст.
Вот так выглядит ссылка на welinux.ru: cutcut.ru/a/1L
А так отобразится простой текст: cutcut.ru/a/2L
Мне не удалось найти более подходящего блога, поэтому пришлось писать сюда. Ну а раз уж блог называется: "Мой OpenSource проект", то вот вам исходники:
github
P.S. Сегодня торжественно добавил бекап этой БД в скрипт-бекапилку. Так что сайтом можно даже смело пользоваться по назначению - ссылки не сгинут вместе с жёстким диском моего сервачка.
P.P.S. Регулярка заинтересовала всех больше всего :) Нет нужды терзать сайтик. Можно на rubular.com потренироваться.
P.P.P.S. Челый час на гитхабе валялись все явки-пароли. Спасибо le087 за бдительность.
Фраза "Познакомится с джангой" подразумевает, что применение костыля входило в условие задачи.
Ну... Регулярка не имеет отношения к джанге. А проблема в том, что регулярки я писать тоже не умею.
давай распишу
/
(?:https?:\/\/)? # (http(s 0 или 1 раз)://) 0 или 1 раз #
(?:www\.)? # (www.) 0 или 1 раз
([a-z0-9]*\.[a-z0-9]{2,3}(?:\/.*)?) # остальной кусок урла, который я, блин, написал без учета поддоменов, сорри #
/i
модификатор "i" = пофиг на регистр
"?:" в начале скобок - значит, что совпадение в скобках не попадает в карман. Фактически, в карман попадет все после http://www.
/
(?:https?:\/\/)? # (http(s 0 или 1 раз)://) 0 или 1 раз #
(?:www\.)? # (www.) 0 или 1 раз
([a-z0-9]*\.[a-z0-9]{2,3}(?:\/.*)?) # остальной кусок урла, который я, блин, написал без учета поддоменов, сорри #
/i
модификатор "i" = пофиг на регистр
"?:" в начале скобок - значит, что совпадение в скобках не попадает в карман. Фактически, в карман попадет все после http://www.
Спасибо. Читать то регулярки я умею :)
У меня с написанием проблемы. Такой вот парадокс (или нет?).
У меня с написанием проблемы. Такой вот парадокс (или нет?).
ну я, в общем, тоже не умею. Говорят, что только Ларри Уолл знает дзен :)
У программиста была проблема. Он решил избавиться от неё с помощью регулярных выражений...
В «пасхалке» про «Ничто» практически все ссылки на википедию битые. Поправь, пожалуйста.
А нужно? Я репозиторий буду создавать дольше, чем это всё пишется с нуля.
нэ? издеваешься? что может быть проще, чем открыть реп на гитхабе и запушить туда весь свой код? Да и другим свои наработки проще раздавать.. давай на гитхаб). Меня твой tar.gz опечалил, и мне лень его качать и разархивировать.
Ладно, ладно. Только теперь в пятницу вечером я окажусь у компа. Просто у меня есть свой git с контролем доступа и кучей репозиториев. Поэтому, мне проще паковать таргз после правок, чем следить, в какой репозиторий я пушу.
До кучи, ссылка на мой сокращатель со звучным русским именем zae.bz : ) : )
быдло-говно-код, поэтому исходников нет : )
p.s. ruby\sinatra\mongodb
быдло-говно-код, поэтому исходников нет : )
p.s. ruby\sinatra\mongodb
я когда-то тоже написал свой укорачиватель на perl+mysql: weeg.ru. если кому интересно. есть желание переписать его на rails, когда-таки разберусь с рельсами.
А я бы с удовольствием посмотрел на сырцы. Именно "перловые", руби не моё.
как вычищу от хлама, дам посмотреть :-)
но шедевров там не наблюдается :-)
но шедевров там не наблюдается :-)
Urlc.ru работает с кириллицей, сокращатель ссылок РФ, Инструменты API
например:
/(?:https?:\/\/)?(?:www\.)?([a-z0-9]*\.[a-z0-9]{2,3}(?:\/.*)?)/i
или вообще нагуглить решение