Комментарии 81
Только на моей памяти — уже третий.
+8
На хабре, на Django? Ссылку, если не сложно.
+2
Ну согласись, задача из простых, и не важно на каком языке, одной публикации с алгоритмом вполне достаточно. К тому же тему начали мусолить еще пару лет назад, а сейчас совсем неактуальна, разве что just4fun
+4
Думаю, новичкам легче учиться на примерах, а их сейчас много — лето. Писал для себя, то есть j4f, за одно решил поделиться.
+9
Я бы не рекомендовал учиться по этому примеру.
0
Подскажите что не так? 'except: pass'?
0
1) except: pass
2) return 'http://example.com/%s' % (short_url.key)
3) так же не понятно назначение sleep(1)
2) return 'http://example.com/%s' % (short_url.key)
3) так же не понятно назначение sleep(1)
0
Да, хотел написать, что можно использовать sites. Назначение sleep(1) описал. 'except: pass' вполне уместно в данном случае, так как мы ничего не ловим, а просто «или да или нет».
0
Да, хотел написать, что можно использовать sites.
Или как минимум вынести в settings.py
'except: pass' вполне уместно в данном случае, так как мы ничего не ловим, а просто «или да или нет»
import this ))))
В общем, лучше было бы писать ошибки в лог, это был бы хороший пример для новичков — ошибки замалчивать нельзя.
0
«except:» не уместно нигде! Именно поэтому на данном примере учиться нельзя.
+2
Да, вы правы. Поленился.
+1
Byteflow | urls.py
Не знаю правда, насколько он сейчас к вам имеет отношение :-) Не сочтите, что я специально искал нечто подобное, просто вспомнил, что давно хотел посмотреть на него, а тут такое )
def error500(request, template_name='500.html'):
try:
output = render_to_string(template_name, {}, RequestContext(request))
except:
output = "Critical error. Administrator was notified."
return HttpResponseServerError(output)
Не знаю правда, насколько он сейчас к вам имеет отношение :-) Не сочтите, что я специально искал нечто подобное, просто вспомнил, что давно хотел посмотреть на него, а тут такое )
+1
piranha@gto ~/dev/web/byteflow> hg ann urls.py|g except: 736: except: piranha@gto ~/dev/web/byteflow> hg log -r 736 changeset: 736:29718324be36 user: Yuri Baburov <burchik@gmail.com> date: Sun May 04 22:14:03 2008 +0700 summary: Added critical bugs handling.
Это был большой мерж и я очевидно пропустил кое-чего. :( Это не извиняет, конечно, но объясняет.
+1
Вообще подобные мелочи, которые несложно исправить, можно сообщать автору лично или публично, чтобы он исправил, а не просто писать подобный первому комментарий.
+2
Я думаю, данное обсуждение будет полезно начинающим программистам.
А письмо в личку в данном случае, будет равносильно except: pass
А письмо в личку в данном случае, будет равносильно except: pass
+6
Ну так я не против, только за ) Но просто писать что, на этом примере учиться нельзя, некрасиво.
-1
Ну, мне кажется, что учиться скорее нужно по примерам кого-то, кто придерживается принятых правил написания кода. А когда человек пишет для того, чтобы к ним придти, то это не пример для обучения, это тренировка самого человека, который пишет. И всë верно, учиться по чужому не очень хорошему коду — не самая удачная идея.
+3
> {{form.as_p}}
Django style guide надо читать. Там сказано, что фигурные скобки нужно отделять пробелами.
Django style guide надо читать. Там сказано, что фигурные скобки нужно отделять пробелами.
0
- — sleep(1) заблокирует весь сервер;
- — Здесь логичнее использовать ModelForms;
- — Сам алгоритм сокрощения урла глуповат;
Это пробежавшись по диагонали.
+4
Спасибо, почему алгоритм глуповат?
+1
Еще: форму нужно обрабатывать в форме (.save()), а не во вьюхе.
0
я так понимаю там был time.sleep — с каких пор он блокирует все трэды?
+1
Очень хорошо, когда на хабре по Django кто-нибудь публикует такие примерчики.
Делая их чему-то новому учишься в плане реализации на Django.
Для совсем начинающих конечно не все будет понятно, но если знать основы, то можно разобраться.
Ведь какие классные обучающие скринкасты имеются по Rails (например railscasts.com и его текстовая версия) и какое там сообщество активное, а по Django очень мало обучающих материалов особенно для начинающих.
Поэтому, если есть возможность, то пишите больше таких обучающих примеров на разные темы.
Большое спасибо!
Делая их чему-то новому учишься в плане реализации на Django.
Для совсем начинающих конечно не все будет понятно, но если знать основы, то можно разобраться.
Ведь какие классные обучающие скринкасты имеются по Rails (например railscasts.com и его текстовая версия) и какое там сообщество активное, а по Django очень мало обучающих материалов особенно для начинающих.
Поэтому, если есть возможность, то пишите больше таких обучающих примеров на разные темы.
Большое спасибо!
0
Пожалуйста. Пишите, о чем бы вам хотелось узнать, что увидеть. Не я, так кто-нибдут другой напишет.
+1
На данном этапе я бы хотел увидеть побольше практических примеров по укрощению джанговской админки: удобная реализация управлением порядком записей (типа ссылок-кнопок вверх-вниз с обновлением значений поля для сортировки), создание своих форм в админке, хранение древовидных структур.
Т.е. хотелось бы побольше туториалов по хакам админки.
Т.е. хотелось бы побольше туториалов по хакам админки.
+1
Кириллические домены видимо не поддерживайтся? =)
0
Сокращалки прям как helloworld уже на всем чем можно написали. Я видел на хабре несколько публикации под заголовком «Пишем свою сокращалку ссылок».
0
Не работает с этой ссылкой:
thelongestlistofthelongeststuffatthelongestdomainnameatlonglast.com/wearejustdoingthistobestupidnowsincethiscangoonforeverandeverandeverbutitstilllookskindaneatinthebrowsereventhoughitsabigwasteoftimeandenergyandhasnorealpointbutwehadtodoitanyways.html
Т.е. шортит, но потом перенаправляет куда-то не туда.
thelongestlistofthelongeststuffatthelongestdomainnameatlonglast.com/wearejustdoingthistobestupidnowsincethiscangoonforeverandeverandeverbutitstilllookskindaneatinthebrowsereventhoughitsabigwasteoftimeandenergyandhasnorealpointbutwehadtodoitanyways.html
Т.е. шортит, но потом перенаправляет куда-то не туда.
+7
Также мы делаем небольшую задержку перед генерацией, чтобы создать кто-нибудь случайно не сгененрировал слишком много ссылок
Как-то мало правдоподобно %) Т.е. от этого можно более железно застраховаться без таких искусственных приемов.
+1
Конечно, можно, но это же рассчитано на новичков. Ничего проще не придумал :)
PS. Ты, наверно, первый кто прочитал )
PS. Ты, наверно, первый кто прочитал )
0
Ну так а зачем новичков таким гадостям обучать? А вдруг они джангу будут в тредах гонять, а там еще и GIL!
+1
Ну вообще такой приём используется очень много где. Во всех аутентификационных алгоритмах «Яндекса», например. Разумеется, там ещё много чего, но это тоже вариант. Я бы не стал делать на этот момент упор.
0
Блин… sleep не блокирует треды
docs.python.org/library/thread.html в самом низу:
Хотя сам метод конечно не одобряю… Нефиг воркеру простаивать без дела
docs.python.org/library/thread.html в самом низу:
Not all built-in functions that may block waiting for I/O allow other threads to run. (The most popular ones (time.sleep(), file.read(), select.select()) work as expected.)
Хотя сам метод конечно не одобряю… Нефиг воркеру простаивать без дела
+3
лучше бы написала сокращалку на чистом яваскрипте с распределённым хранилищем на клиентах х)
0
Круто. Подробный туториал))
Буквально на прошлой неделе реализовывал подобный функционал (только у меня создаются странички с такими короткими урлами))
Буквально на прошлой неделе реализовывал подобный функционал (только у меня создаются странички с такими короткими урлами))
-4
НЛО прилетело и опубликовало эту надпись здесь
ну вот, а я там думал, там какая то чумовая функция хеширования. Оказалось все банально.
0
Жду статью «100 и 1 способ применить короткий домен не как сокращалку ссылок» или просто «Как удержаться от соблазна написать очередную сокращалку, которая закроется через полгода и немного поломает Интернет» :)
+1
что так сложно, делаю сайт hrumm.ru так на пхп это
base_convert($id, 10, 36)
а потом
$uri=preg_replace('/\//','',$_SERVER['REQUEST_URI']);
$res=mysql_query(«SELECT url FROM links WHERE id=».intval($uri,36));
if(is_resource($res)) {
$url = mysql_fetch_assoc($res);
header('Location:'.$url[url]);
} else {
echo «404 — Page Not Found»;
}
и это всё!!!
base_convert($id, 10, 36)
а потом
$uri=preg_replace('/\//','',$_SERVER['REQUEST_URI']);
$res=mysql_query(«SELECT url FROM links WHERE id=».intval($uri,36));
if(is_resource($res)) {
$url = mysql_fetch_assoc($res);
header('Location:'.$url[url]);
} else {
echo «404 — Page Not Found»;
}
и это всё!!!
-4
Адрес «http://f» приводит к 500-й ошибке. Причём, иногда выдаётся кастомная страница сайта для 500-й ошибки, а иногда выдаётся страница Apache
0
try:
hit = Hit()
hit.target = target
hit.referer = request.META.get(«HTTP_REFERER», "")
hit.ip = request.META.get(«REMOTE_ADDR», "")
hit.user_agent = request.META.get(«HTTP_USER_AGENT», "")
hit.save()
except:
pass
а в чем тут суть, почему может быть исключение?
hit = Hit()
hit.target = target
hit.referer = request.META.get(«HTTP_REFERER», "")
hit.ip = request.META.get(«REMOTE_ADDR», "")
hit.user_agent = request.META.get(«HTTP_USER_AGENT», "")
hit.save()
except:
pass
а в чем тут суть, почему может быть исключение?
0
save не прошел, например. база отсохла в процессе или еще что-нибудь исключительное случилось.
+1
никто, к тому же, не может гарантировать, что в django 1.8, к примеру, на mysql 8 будет еще какая-нибудь функциональность вызывающая исключения, а такой код (молчаливый игнор всех исключений) может доставить некий неиллюзорный геморрой при поиске — почему хиты не сейвятся. Ну, в более большом приложении, конечно, тут-то и отлаживать по большому счету нечего.
0
хорошая стать, как раз относительно недавно начал изучать python(Django) после java
-2
Нормально написано, это лучше чем выводить на главную всякие бестолковые картиночки.
Я не шарю в Python и Django прочитал с удовольствием.
Только одно покоробило, генерация ключа и всё это перечисление. Неужели алфавит нельзя было задать через range A..Z например, есть такое в Python?
И я бы с делал проще, генерил бы md5 например по времени и отрезал кол-во нужных символов.
И вот тут буква «r» точно не глюк?
(r'^$', 'views.index')
Я не шарю в Python и Django прочитал с удовольствием.
Только одно покоробило, генерация ключа и всё это перечисление. Неужели алфавит нельзя было задать через range A..Z например, есть такое в Python?
И я бы с делал проще, генерил бы md5 например по времени и отрезал кол-во нужных символов.
И вот тут буква «r» точно не глюк?
(r'^$', 'views.index')
+1
Спасибо. Исправил перечисление.
String literals may optionally be prefixed with a letter 'r' or 'R'; such strings are called raw strings and use different rules for interpreting backslash escape sequences.
+1
И вот тут буква «r» точно не глюк?
(r'^$', 'views.index')
Нет, не глюк.
Это так называемые raw-строки — то есть строки, в которых не обрабатываются обратные слеши как символы экранирования — они обозначают просто обратные слеши. Это очень удобно для написания регекспов, урлов и так далее, из-за того что не приходится дважды экранировать символы. Сравните:
r'[\s\d]+' или
'[\\s\\d]+'
Первый вариант читается намного лучше, меньше вероятность сделать ошибку, неправильно посчитав слеши.
+2
Хотелось бы еще добавить кнопку «почитать что нить» при клике на которую был бы переход по случайной ссылке из базы.
+1
0
1. рандом — говно
2. ограничение на длину в 3 символа — говно (хотя, понятно, что у вас рандом, поэтому так)
3. правильно писать свой sequence в postgres
4. ну, на крайний случай, можно сохранять в базу, получать id, а потом конвертировать его в key как-нибудь так:
import string
characters = string.digits + string.letters
base = len(characters)
def make_key(num):
rem, res = divmod(num, base);
return ('' if rem == 0 else make_key(rem)) + characters[res]
2. ограничение на длину в 3 символа — говно (хотя, понятно, что у вас рандом, поэтому так)
3. правильно писать свой sequence в postgres
4. ну, на крайний случай, можно сохранять в базу, получать id, а потом конвертировать его в key как-нибудь так:
import string
characters = string.digits + string.letters
base = len(characters)
def make_key(num):
rem, res = divmod(num, base);
return ('' if rem == 0 else make_key(rem)) + characters[res]
0
К конструкции if form.is_valid() надо добавить что-нибудь такое:
Т.к. если ввести например 11111111, то вылетит ValueError — index didn't return an HttpResponse object.
-
- else:
- return render_to_response('shortener.html', {'form': form, 'url': ''})
-
Т.к. если ввести например 11111111, то вылетит ValueError — index didn't return an HttpResponse object.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Пишем свой URL Shortener