Pull to refresh

Comments 81

На хабре, на Django? Ссылку, если не сложно.
Ну согласись, задача из простых, и не важно на каком языке, одной публикации с алгоритмом вполне достаточно. К тому же тему начали мусолить еще пару лет назад, а сейчас совсем неактуальна, разве что just4fun
Думаю, новичкам легче учиться на примерах, а их сейчас много — лето. Писал для себя, то есть j4f, за одно решил поделиться.
Я бы не рекомендовал учиться по этому примеру.
Подскажите что не так? 'except: pass'?
1) except: pass
2) return 'http://example.com/%s' % (short_url.key)
3) так же не понятно назначение sleep(1)
Да, хотел написать, что можно использовать sites. Назначение sleep(1) описал. 'except: pass' вполне уместно в данном случае, так как мы ничего не ловим, а просто «или да или нет».
Да, хотел написать, что можно использовать sites.

Или как минимум вынести в settings.py

'except: pass' вполне уместно в данном случае, так как мы ничего не ловим, а просто «или да или нет»

import this ))))
В общем, лучше было бы писать ошибки в лог, это был бы хороший пример для новичков — ошибки замалчивать нельзя.
Да какие нафиг сеттингсы? Чем редирект относительно корня не устраивает здесь?
Тоже верно! Ступил )))
«except:» не уместно нигде! Именно поэтому на данном примере учиться нельзя.
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)

Не знаю правда, насколько он сейчас к вам имеет отношение :-) Не сочтите, что я специально искал нечто подобное, просто вспомнил, что давно хотел посмотреть на него, а тут такое )
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.


Это был большой мерж и я очевидно пропустил кое-чего. :( Это не извиняет, конечно, но объясняет.
Вообще подобные мелочи, которые несложно исправить, можно сообщать автору лично или публично, чтобы он исправил, а не просто писать подобный первому комментарий.
Я думаю, данное обсуждение будет полезно начинающим программистам.
А письмо в личку в данном случае, будет равносильно except: pass
Ну так я не против, только за ) Но просто писать что, на этом примере учиться нельзя, некрасиво.
Ну, мне кажется, что учиться скорее нужно по примерам кого-то, кто придерживается принятых правил написания кода. А когда человек пишет для того, чтобы к ним придти, то это не пример для обучения, это тренировка самого человека, который пишет. И всë верно, учиться по чужому не очень хорошему коду — не самая удачная идея.
Ну так вместе с комментариями пост и составляет материал для учёбы. Учусь я, учатся читающие. Разве нет? Я же не претендую на то, что мой код идеален и я в праве кого-то учить.
UFO just landed and posted this here
> {{form.as_p}}

Django style guide надо читать. Там сказано, что фигурные скобки нужно отделять пробелами.
  • — sleep(1) заблокирует весь сервер;
  • — Здесь логичнее использовать ModelForms;
  • — Сам алгоритм сокрощения урла глуповат;


Это пробежавшись по диагонали.
Спасибо, почему алгоритм глуповат?
Потому что в случае, если сгенерируется существующий ключик, вылетит исключение. Вероятность не очень низка, потому что у нас всего 3 позиции.
Лучше всего сделать так: в базе поставить целочисленный первичный ключ с автоинкрементом и его представлять по основанию размера алфавита.
Еще: форму нужно обрабатывать в форме (.save()), а не во вьюхе.
я так понимаю там был time.sleep — с каких пор он блокирует все трэды?
Окей, большое спасибо за комментарии.
ничего глупее для обеспечения «безопасности» придумать нельзя
Очень хорошо, когда на хабре по Django кто-нибудь публикует такие примерчики.
Делая их чему-то новому учишься в плане реализации на Django.
Для совсем начинающих конечно не все будет понятно, но если знать основы, то можно разобраться.
Ведь какие классные обучающие скринкасты имеются по Rails (например railscasts.com и его текстовая версия) и какое там сообщество активное, а по Django очень мало обучающих материалов особенно для начинающих.
Поэтому, если есть возможность, то пишите больше таких обучающих примеров на разные темы.

Большое спасибо!
Пожалуйста. Пишите, о чем бы вам хотелось узнать, что увидеть. Не я, так кто-нибдут другой напишет.
На данном этапе я бы хотел увидеть побольше практических примеров по укрощению джанговской админки: удобная реализация управлением порядком записей (типа ссылок-кнопок вверх-вниз с обновлением значений поля для сортировки), создание своих форм в админке, хранение древовидных структур.

Т.е. хотелось бы побольше туториалов по хакам админки.

Админка — не панацея для всего. Накручивать её до ****нной логики нет смысла.
Зачем хакать, если можно написать нормальный админский интерфейс для своего проекта самому?
Кириллические домены видимо не поддерживайтся? =)
*не поддерживаются
Сокращалки прям как helloworld уже на всем чем можно написали. Я видел на хабре несколько публикации под заголовком «Пишем свою сокращалку ссылок».
Автор, и на этот коммент обрати внимание. Глюк в софтине, причëм очевидно, почему. :)
Также мы делаем небольшую задержку перед генерацией, чтобы создать кто-нибудь случайно не сгененрировал слишком много ссылок


Как-то мало правдоподобно %) Т.е. от этого можно более железно застраховаться без таких искусственных приемов.
Конечно, можно, но это же рассчитано на новичков. Ничего проще не придумал :)

PS. Ты, наверно, первый кто прочитал )
Ну так а зачем новичков таким гадостям обучать? А вдруг они джангу будут в тредах гонять, а там еще и GIL!
Ну вообще такой приём используется очень много где. Во всех аутентификационных алгоритмах «Яндекса», например. Разумеется, там ещё много чего, но это тоже вариант. Я бы не стал делать на этот момент упор.
Блин… sleep не блокирует треды
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.)


Хотя сам метод конечно не одобряю… Нефиг воркеру простаивать без дела
лучше бы написала сокращалку на чистом яваскрипте с распределённым хранилищем на клиентах х)
И хранить там ссылки видеть «С:\Мои документы\Рисунок.jpg»
даёшь веб-сервер на веб-сокетах! х)
UFO just landed and posted this here
primary_key разве с этим не справится?
UFO just landed and posted this here
ну вот, а я там думал, там какая то чумовая функция хеширования. Оказалось все банально.
Жду статью «100 и 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»;
}

и это всё!!!
UFO just landed and posted this here
facepalm.jpg
Не в тему.
Адрес «http://f» приводит к 500-й ошибке. Причём, иногда выдаётся кастомная страница сайта для 500-й ошибки, а иногда выдаётся страница Apache
Это не адрес приводит к ошибке, а сервер перегружен — img. Некастомная страница выдаётся, когда ему совсем плохо.
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

а в чем тут суть, почему может быть исключение?
save не прошел, например. база отсохла в процессе или еще что-нибудь исключительное случилось.
никто, к тому же, не может гарантировать, что в django 1.8, к примеру, на mysql 8 будет еще какая-нибудь функциональность вызывающая исключения, а такой код (молчаливый игнор всех исключений) может доставить некий неиллюзорный геморрой при поиске — почему хиты не сейвятся. Ну, в более большом приложении, конечно, тут-то и отлаживать по большому счету нечего.
хорошая стать, как раз относительно недавно начал изучать python(Django) после java
Нормально написано, это лучше чем выводить на главную всякие бестолковые картиночки.

Я не шарю в Python и Django прочитал с удовольствием.

Только одно покоробило, генерация ключа и всё это перечисление. Неужели алфавит нельзя было задать через range A..Z например, есть такое в Python?
И я бы с делал проще, генерил бы md5 например по времени и отрезал кол-во нужных символов.

И вот тут буква «r» точно не глюк?
(r'^$', 'views.index')
Спасибо. Исправил перечисление.

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.
И вот тут буква «r» точно не глюк?
(r'^$', 'views.index')

Нет, не глюк.
Это так называемые raw-строки — то есть строки, в которых не обрабатываются обратные слеши как символы экранирования — они обозначают просто обратные слеши. Это очень удобно для написания регекспов, урлов и так далее, из-за того что не приходится дважды экранировать символы. Сравните:
r'[\s\d]+' или
'[\\s\\d]+'
Первый вариант читается намного лучше, меньше вероятность сделать ошибку, неправильно посчитав слеши.
Хотелось бы еще добавить кнопку «почитать что нить» при клике на которую был бы переход по случайной ссылке из базы.
баг :)
при длине url'a менее чем len(n0te.ru/s/xyz) надо возвращать «it's short enough»
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]
К конструкции if form.is_valid() надо добавить что-нибудь такое:
  1.  
  2. else:
  3.     return render_to_response('shortener.html', {'form': form, 'url': ''})
  4.  

Т.к. если ввести например 11111111, то вылетит ValueError — index didn't return an HttpResponse object.
Ввёл ваш «например». Всё нормально.
точно)и повнимательней присмотревшись я понял почему все нормально))-это у меня глаза кривые)
Only those users with full accounts are able to leave comments. Log in, please.