Публикации о языке Python   страница 306

[django] Как поиметь юзера везде

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

Я уже давно стырил откуда-то такой вот код для этого самого всовывания/высовывания:

# -*- coding: utf-8 -*-
try:
    from threading import local
except ImportError:
    from django.utils._threading_local import local

_thread_locals = local()

def set_current_user(user):
    setattr(_thread_locals, 'user', user)

def get_current_user():
    return getattr(_thread_locals, 'user', None)


Положим этот код, например в common.user, тогда прослойка для засовывания будет такой:

from common.user import set_current_user

class CurrentUserMiddleware(object):
    def process_request(self, request):
        set_current_user(getattr(request, 'user', None))

Вот и всё. Теперь в любом месте имеем текущего юзера:



Twisted в действии — memcache на python

Преамбула

В связи с выходными потратил немного времени на реализацию сервера Memcache с использованием python-фреймворка Twisted. В итоге я получил быстродействие в два раза более низкое, что я не считаю очень критичным, а также возможность реализовать парочку расширений оригинального протокола. Также возможны оптимизации, которые еще улучшат быстродействие.
Протокол не был реализован полностью - есть еще моменты над которыми можно поработать, но стандартные set/get вполне работоспособны и готовы к использованию.

Средства

Для хранения кеша используем базовый класс dict. Как вы догадываетесь, реализация dict в python быстра, этот базовый тип используется в python настолько активно, что его не оставили без детально



Twisted в действии — memcache на python

Преамбула

В связи с выходными потратил немного времени на реализацию сервера Memcache с использованием python-фреймворка Twisted. В итоге я получил быстродействие в два раза более низкое, что я не считаю очень критичным, а также возможность реализовать парочку расширений оригинального протокола. Также возможны оптимизации, которые еще улучшат быстродействие.
Протокол не был реализован полностью - есть еще моменты над которыми можно поработать, но стандартные set/get вполне работоспособны и готовы к использованию.

Средства

Для хранения кеша используем базовый класс dict. Как вы догадываетесь, реализация dict в python быстра, этот базовый тип используется в python настолько активно, что его не оставили без детально



Стиль кода в Python: Part 2

Комментарии

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

Комментарии должны являться законченными предложениями. Если комментарий — фраза или предложение, первое слово должно быть написано с большой буквы, если только это не имя переменной, которая начинается с маленькой буквы (кстати, никогда не отступайте от этого правила для имен переменных).

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

Ставьте два пробела после точки в конце предложения.

Если вы пишете по-английски, не забывайте о Странке и Уайте (имеется в виду книга Strunk & White, “Elements of style”, которая является практически эталонным руководством по правильному написанию текстов на английском языке, —




Стиль кода в Python: Part 1

Введение

Этот документ описывает соглашение о том, как писать код для языка python, включая стандартную библиотеку, входящую в состав python. Пожалуйста, посмотрите также на сопутствующий PEP (python enhanced proposal — заявки на улучшение языка python), описывающий, какого стиля следует придерживаться при написании кода на C в реализации языка python1.

Этот документ создан на основе рекомендаций Гуидо ван Россума с добавлениями от Барри. Если где-то возникал конфликт, мы выбирали стиль Гуидо. И, конечно, этот PEP может быть неполным (фактически, он, наверное, никогда не будет закончен).

A Foolish Consistency is the Hobgoblin of Little Minds2

Ключевая идея Гуидо такова: код читается намного больше раз, чем пишется. Собственно, рекоммендации о стиле написания кода направлены на то, чтобы улучшить читбельность кода и сделать его согласованным между большим числом проектов. В идеале, весь код будет написан в




Автоматическая фильтрация публичных данных в SQLAlchemy

В CMS в таблице для (почти) каждой сущности обычно добавляется поле-флаг, определяющее, должна ли данная сущность показываться на сайте. В коде сайта, соответвенно, необходимо не забывать добавлять соответствующее условие в каждый запрос. При использовании ORM мы автоматичеси получаем связанные сущности, для которых запрос генерируется автоматически. Это удобно, но теперь нам ещё нужно проверять, нужно ли показывать каждый из связанных объектов. Есть ещё множество ситуаций, когда такие проверки или добавление дополнительных условий также необходимы. Шансы, что в большом проекте где-то об этом забудут, близки к 100%. Поэтому очень желательно процесс фильтрации непубличных данных автоматизировать. В django для этих целей используют специально написанный менеджер. В древней библиотеки QPS с некоторым подобием ORM сделано даже лучше: можно для разных тегов выборки определить разные правила формирования запроса и даже правила переноса тегов на связа



Используем встроенные строковые методы Python'а в Django шаблонах

Вместо предисловия

Привет! Давно здесь не отписывался. Почему? Наверное главная причина, что после выхода 1.1 версии уже не так активно слежу за развитием Django. Может быть в ближайшее время меня пробъет на творчество и я выдам пару-тройку новых постов, но не обещаю ;)


Но это я отвлекся от темы поста. А она заключается вот в чем. Надо было сегодня в шаблонах Django для некоторых урлов убрать конечные слеши, т.е. просто вызвать url.rstrip('/'). Просмотрев в который раз список всторенных шаблонных фильтров и не обнаружив там нужного, я задумался: как быть? Создавать простой фильтр, типа:

from django.template import Library
from django.template.defaultfilters import stringfilter


register = Library()


@register.filter
@stringfilter
def rstrip(text, chars=None):
    return text.rstrip(chars)

совершенно не хотелось. Ибо вдруг мне в будущем захочется добавить поддержку lstrip или strip метода.




Облачные вычисления от гигантов IT-рынка

С активным развитием веб-приложений начался буйный рост технологий облачных вычислений. Об этом я уже писал в своём предыдущем посте, где сделал краткий обзор основных видов облаков. Теперь же попробую быстро проскочить по cloud-сервисам, предоставляемым ключевыми вендорами на рынке.

Первым серьёзным и доступным cloud-хостингом явился Amazon Elastic Compute Cloud (Amazon EC2). Сейчас Amazon является одним из наиболее крупных игроков на рынке облачных вычислений. Множество компаний пользуется облачным сервисом именно от Amazon. Насколько мне известно, даже известный сервис для микроблоггинга Twitter решил проблему масштабирования с Amazon EC2. Услуги, связанные с облачными вычислениями, Amazon предоставляет под единым брендом Web Services. Кроме Amazon EC2 туда входят:

Simple DB – сервис, предоставляющий ядро функций базы данных,




Мораторий на развитие Python

Логотип интерпретатора Python

Разработчики Python официально приняли мораторий, запрещающий изменение синтаксиса языка Python версии 3.1 на срок до 26 июня 2011 года. Целью моратория является задержка развития языка, чтобы сторонние проекты для Python догнали в своём развитии Python третьей ветки. Отставание вызвано тем, что вторая и третья ветки являются несовместимыми, и поэтому многие альтернативные проекты Python, такие как Jython,IronPython, Unladen Swallow, продолжают базироваться на Python 2.7. На время заморозки развития усилия разработчиков будут направлены на портирование библиотек для старой ветки языка на Python 3, написании утилит и документации.
Это всё меня лично очень радует, и я с радостью проголосовал бы за продление мора




Язык программирования Go

Язык программирования Go

Неожиданно так для многих из нас Google анонсировал новый язык программирования, в котором разработчики хотят объединить мощность C++ и лаконичность Python. Поэтому, по словам девелоперов, разработка на Go так же быстра, как и разработка на Python, и так же мощна, как на C++ и Java. Пока язык представляет собой эксперимент, который ставит Google, так как сам Go ещё не достаточно зрелый для серьёзных проектов.

Вот «хелловорд», представленный на главной странице официального сайта Go:

package main

import “fmt”

func main() {
fmt.Printf(”Hello, 世界\n”)
}

Эти начинания, конечно же, хороши. Но вот только возник один небольшой казус. Вот дискуссия , в которой Francis McCabe просит компанию Google