27 окт. 2009 г.

Базовый инстинкт Иоанна Охлобыстина

Считаю своим моральным долгом поделиться ссылкой на статью “Базовый инстинкт” на сайте русской недели автора священника Иоанна Охлобыстина.

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

Напишу только, что с автором согласен, но практиковать подобные методы не пробовал. Мне мир, очевидно в виду бОльшей удаленности от Москвы, кажется дружелюбным. Но сына своего я на улице одно оставлять боюсь. Особенно, после того, как один не благополучный подросток ни за что, ни про что отлупил его во дворе нашего дома ногами по лицу, на глазах у многих соседей. Серьезных последствий у данного инцидента не было. Причем не только для сына, но и для подростка, на которого мы заявили в милицию.

LinkExchange и Django

Наверняка, баян, но не поделиться не могу – слишком уж вещь хорошая.

Итак, LinkExchange - инструмент для встраивания кода бирж обмена ссылками в сайты написанные с применением python’a. Главная ссылка на wiki данного инструмента http://linkexchange.org.ua/.

Имеется поддержка любимой django - http://linkexchange.org.ua/wiki/LinkExchangeИDjango, а также MoinMoin, Trac, TurboGears.

Подключается к django проекту, как  и другие хорошие pluggable-приложения, в 3 шага:

  1. Добавляем 'django.core.context_processors.request' в TEMPLATE_CONTEXT_PROCESSORS.
  2. Создаем файл linkexchange.cfg, делаем на него ссылку из settings.py
  3. Вставляем в шаблоны переменную linkexchange_blocks.

Можно ставить через easy_install, так как в списке пакетов на PyPI библиотека LinkExchange присутствует.

UPD. Использовал библиотеку в одном из своих проектов (поставил setuptool’ом), набрел на некоторые отступления от “3 этапного туториала”. Ниже публикую все изменения, которые пришлось внести в проект, чтоб он начал работать с sape библиотекой linkexchange:


# settings.py:



INSTALLED_APPS = (

    ...

    'linkexchange.django',

)



TEMPLATE_CONTEXT_PROCESSORS = (

    ...

    'django.core.context_processors.request',

    'linkexchange.django.context_processors.linkexchange',

)



LINKEXCHANGE_CONFIG = join(working_dir, 'linkexchange.cfg'# working_dir = os.path.dirname(__file__)









# linkexchange.cfg:



[options]

host = f.labwr.ru



[client-1]

type = sape

user = идмоегоюзерабезкавычек

db_driver.type = shelve

db_driver.filename = полныйпутьдокаталогапроекта/linksdb/linkexchange.db



[formatter-1]

type = list

count = 2

class_ = linx

prefix = "- "

suffix = ". "



[formatter-2]

type = inline

count = 2

class_ = linx

delimiter = " | "

prolog = "| "

epilog = " |"



[formatter-3]

type = list

count = none

class_ = linx

prefix = "+ "

suffix = ". "









# templates/base.html:



{% load linkexchange_tags %}

{{ linkexchange_blocks }}


У каталога linksdb выставлены разрешения на запись всем и владелец под которым работает apache - таким образом я решал проблему с блокировкой файла, но наверняка есть более правильный способ.

26 окт. 2009 г.

Вышла Satchmo 0.9

25-го октября (то есть вчера) вышла 0.9 версия Satchmo. Если кто не в курсе, Satchmo – это платформа для создания интернет магазина. Написана на джанго с применением огромного количества сторонних и собственных (для разработчиков) приложении.

“Большая” – не подходить для описания Satchmo, надо писать монстроузная система. Прошлый раз при попытке установить Satchmo я несколько часов убил только на то, чтоб собрать все зависимости, после чего она так и не заработала как нужно.

Наверное, теперь все изменилось, по крайней мере я на это надеюсь. Если у Вас сложилось впечатление о Satchmo, похожее на мое смотрите в сторону django-LFS.

Новое в Satchmo 0.9 - http://www.satchmoproject.com/docs/svn/release-notes-0-9.html - среди прочего включает

  • Improvement to the installation process to make it simpler

- ну-ну. Надеюсь, так оно и есть…

UPD: Кстати, на странице документации по быстрому старту, действительно, есть описание сборки с помощью pip, так что, наверное, скоро тролли в комментариях начнут заставлять меня извинятся.

Тест Лайтмана

На torrents.ru в ленте обсуждения сериала Lie To Me есть ссылка на тест Лайтмана на сайте fox: http://www.fox.com/lietome/lightmantests/.

Посмотреть самому пока не удалось – флэш плагин в Chrome виснет. В последнее время в хроме вообще как-то все не стабильно, но это похоже, только у меня – раздраконненная временем виста берет свое (требует больше внимания чем положено).

23 окт. 2009 г.

Block REQUEST_URI adresses

Вчера некто пытался подобрать адрес к phpmyadmin (а затем бы и пароль), видимо, на одном из моих сайтов.

Работал с 2 IP адресов, видимо, какой-то программой, так как за 1 минуту перебрал 26 предполагаемых URI.

Придется как-то реагировать на это событие. Как вариант заблокировать оба адреса. Ну для этого, видимо можно использовать снипет http://www.djangosnippets.org/snippets/744/ или настройку BANNED_IPS в самой django.

Можно ещё избавиться от трейсбэков по поводу не существующей страницы немного переработав указанный ранее снипет:


from django.conf import settings

from django import http



class BlockedUriMiddleware(object):



    def process_request(self, request):

        if request.META['REQUEST_URI'] in settings.BLOCKED_URIS:

            return http.HttpResponseForbidden('<h1>Forbidden</h1>')

        return None



# in settings.py:



MIDDLEWARE_CLASSES = (

    ...

    "myapp_with_middleware_module.BlockedUriMiddleware",

)



BLOCKED_URIS = (

    '/phpmyadmin/index.php',

    '/phpMyAdmin/index.php',

    '/PMA/index.php',

    '/pma/index.php',

    '/dbadmin/index.php',

    '/mysql/index.php',

    ...

)


Кстати в тест-сервере (это тот, что по runserver запускается) нет никакого REQUEST_URI, так что работать не будет – подробнее тут http://groups.google.com/group/django-users/browse_thread/thread/3261e7ece9ff3b33.

UPD: А можно ещё внимательней почитать документацию и обнаружить для себя два параметра настройки: IGNORABLE_404_ENDS и IGNORABLE_404_STARTS.

Со вторым, вместо BLOCKED_URIS можно написать IGNORABLE_404_STARTS со следующим контентом:


IGNORABLE_404_STARTS = (

    '/cgi-bin/'

    '/_vti_bin'

    '/_vti_inf'



    '/php',

    '/PMA',

    '/pma',

    '/dbadmin',

    '/mysql',

    '/myadmin',

    '/sql',

    '/p/m/a/',

    '/web',

    '/Tools',

    '/index.php',

    '/wp-login',

)


Первые три лежат в настройке по умолчанию.

22 окт. 2009 г.

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

Очень просто и очень глупо, оказывается, можно было решить мою давнишнюю проблему с наследованием шаблонов в многодоменном  django-проекте.

У меня есть сетка сайтов одной и той же фирмы с разным дизайном, но примерно одинаковым контентом. Для каждого сайта есть базовый шаблон base.html в котором прописаны стили, индивидуальная верстка, общие блоки и пр.

В общем решаю проблему так: есть функция, генерирующая общие для всех сайтов переменные:


def listing_and_path(request):

    ...

    rhost = request.get_host().strip('w.')

    ...

    try:

        profile = SiteProfile.objects.get(site__domain=rhost)

    except:

        profile = False

    base_tamplate = u'%s/base.html'%rhost

    return {

            'pages': Page.objects.filter(sites__domain=rhost, state='published').order_by('position'),

             ...

            'profile': profile,

            'base_tamplate':base_tamplate,

    }


Как и все приличные контекстные процессоры, данная функция подключена в settings.py:


TEMPLATE_CONTEXT_PROCESSORS = (

    "django.core.context_processors.auth",

    "django.core.context_processors.debug",

    "django.core.context_processors.i18n",

    "django.core.context_processors.media",

    "django.core.context_processors.request",

    "realtor.views.listing_and_path",

)


В шаблоне наследнике или в общем шаблоне используется конструкция вида:


{% extends base_template %}


Вещи, вроде бы, очевидные, но у меня до недавнего времени были полные копии веток шаблонов, в которых отличались только


{% extends '72arenda.ru/base.thml' %}



# или 



{% extends 'realtor-tyumen.ru/base.thml' %}


- что, как вы понимаете, клиника.

Pygments в Windows Live Writer для подсветки кода

Заметили, наверное, что в моем блоге начали чаще появляться куски кода? Это связано с тем, что выглядят они теперь лучше, а все благодаря плагину Pygments for WL Writer, который можно взять тут:

http://cid-0d9bc809858885a4.skydrive.live.com/browse.aspx/DevHawk%20Content/Pygments%20for%20WL%20Writer