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

Моя борьба с javascript ч.2.

Ок. Компилятор выбран. Однако, это только половина задачи. Вторая половина задачи выходит из того факта, что, если я хочу подключать .py файлы из шаблона — мне нужно кеширование и компиляция кода в зону static. Я совсем не хочу, чтобы при каждом рендере шаблона вызывался довольно тяжелый компилятор. Кроме того, для установки сервера в productive режим, у меня на руках должен оказаться работающий набор скомпилированных скриптов. А еще, я хочу не думать о том, что библиотеки могут загружаться на страницу позже кода. Сопроводительные задачи должен решать робот. Для этой цели собственно и был написан django-compressor.

Вообще, django-compressor довольно спорный tool. Спорный с точки зрения необходимости — гораздо правильнее строить приложение так, чтобы задачи которые решает компрессор, вообще не вставали. Гораздо правильнее использовать




Django & WYSIWYG

Интро Я по прежнему продолжаю изучать Django + Python. Пока этот тандем не перестает меня радовать. И все больше усилий мне приходится делать над собой, чтобы разрабатывать на работе на PHP с использованием самописного фреймворка. И вот, на одном из сайтов понадобился WYSIWYG-редактор. TinyMCE Моим первым претендентом на звание django-редактора был TinyMCE. Однако “из коробки” [...]




Про исключения в питоне

Уважаемые товарищи python-девелоперы,

Eсли кто не знает, или не помнит, или не задумывался об этом.

Если вы хотите обернуть внутреннюю ошибку в новое исключение (“сделать reraise”), например, в таком коде:

try:
    do_something()
except Exception, e:
    raise e

То внутренние фреймы стека у вас забудутся, первым фреймом будет строчка с raise e

Если вы не хотите терять внутренние фреймы, пишите так:-->-->

import sys

try:
    do_something()
except Exception, e:
    raise Exception, "MyException", sys.exc_info()[2]

так:

import sys

try:
    do_something()
except Exception, e:
    raise Exception("MyException"), None, sys.exc_info()[2]

или так:

try:
    do_something()
except Exception, e:
    raise

Обернуть исключение как в Java через throw MyException(e) увы нельзя, т.е. внутреннее с




create_object и дополнительные поля создаваемого объекта

Среди убойных возможностей django хочется отметить generic views. Поначалу я их не заметил и практически никак не использовал, но после прочтения этой статьи присмотрелся внимательней и проникся. Сейчас иногда получается, что они напрямую или через функции-обертки реализуют почти весь view-слой сайта.

Одной из проблем, с которой я столкнулся при использовании generic views — это вопрос о том, как добавить в объект, создаваемый через create_object, дополнительные данные. Например, при создании новой статьи хочется автоматом прописывать залогиненного пользователя, который её написал. Поскольку create_object создает и использует ModelForm внутри себя, то способ передачи request.user в эту форму не совсем очевиден.

А способ-то довольно прост — достаточно описать ModelForm внутри функции-обертки над create_object. Если в этом описании переопределить метод save(), то request б




Без права редактирования

Опять же постил на djbook.ru.
Есть модель комментариев. Нужен интерфейс в админке для их модерирования. Модератор может только удалять комментарии, во избежания казусов "я такого не писал". Нужно убрать права на изменение записи и убрать все ссылки на страницу редактирования комментария.


#models.py

Copy Source | Copy HTML
  1. class Comment(BaseComment):
  2.     content_type = models.ForeignKey(ContentType, related_name="content_type_set_for_%(class)s")
  3.     object_id = models.TextField('object ID')
  4.     content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="ob



Подгрузка связанных моделей (многие-ко-многим)

Постил когда-то на djbook.ru решил и сюда добавить.
Select_related не работает для обратных связей. В мануале Django, в примере, используется обычный менеджер для обратных связаных таблиц, который посылает запрос при обращении к ним. Можно, конечно, использовать raw sql, когда нет доступа к методам моделей, например, get_absolute_url и др. Функция load_related_m2m для обьектов в object_list получает все связаные(m2m) через поле field обьекты и заносит в поле "all_" % field обьекта. В результате получаем всего один лишний запрос на каждую связаную таблицу.

Вот здесь Анатолий Ларин запостил версию для Django 1.2.



#models.py

Copy Source | Copy HTML
  1. class Pos



Pro Django

Скачал замечательнейшую книгу по Django. Нет никаких описаний типов переменных, операторов и других основ Python, а сразу про метапрограммирование и его приминение в Django. Правда многое уже изучено по исходникам Django :)
http://www.ebookslab.info/pro-django.html




direct_to_template вместо render_to_response

Везде и всюду для загрузки и рендеринга шаблона для последующей отдачи браузеру рекомендуется использовать функцию render_to_response. Однако, если её использовать правильно, а не так, как написано в туториале, то помимо самой функции приходится импортировать еще и RequestContext, и явно передавать его:

from django.shortcuts import render_to_response
from django.template import RequestContext

def my_view(request):
    return render_to_response('my_template.html',
                              {'object_list': SomeModel.objects.all()},
                              context_instance=RequestContext(request))

То есть по факту получается, что это не такой уж и shortcut. Такой многословный код приводит к тому, что многие программисты делают собственные версии render_to_response, которые одним из параметров принимают request. А особо продвинутые джангонавты д




"У нас профилактика."

Когда обновляешь что-то на сервере, не всегда уверен что всё будет сразу работать(про тестирование, и автоматическое обновление можно и не мечтать). Показывать 500, пока правишь какую-то мелочь, про которую забыл не очень хочется. По-этому нужно закрыть доступ на время страницей "Мы обновляемся". Решил подменять ответ Handler-а Django(в нашем случае WSGIHandler) на эту самую страницу, если REMOTE_ADDR не входит в INTERNAL_IPS(мне то нужно обновить и проверить всё ли работает).Создаём два скрипта один из которых и будет подменять ответ. В настройках хостинга в AddHandler прописываем путь к симлинку на один из скриптов, симлинк будем менять консольной командой, например: python manage.py site off. Командой - python manage.py site on - логично, будем возвращать сайт на место.



Собственно наша команда, располагаем её в модуле любого установленого нами приложения в INSTALLED_APPS, в management/commands/syte.py




classproperty - свойство класса

Иногда нужно чтобы у класса было некое свойство, а декоратор property в данном случае не подходит.
Тогда я написал небольшой дескриптор:


class classproperty(object):
def __init__(self, func):
self.func = func

def __get__(self, instance, cls):
return self.func(cls)


Используется также как и декоратор property:

class A(object):
@classproperty
def name(cls):
return cls.__name__

A.name # вернёт имя класса