Не используйте email backend в django, если конечно вам достаточно smtp. А если нет? Вот я лучше прибегну к серверной команде sendmail для отправки почты, чем буду использовать smtp для приложения.
При этом подходе мы получаем возможность очереди отправки, нам не надо писать отдельный скрипт и ложить его в крон задачу. Улучшается производительность системы за счет того, что операций запроса, авторизации и отправки прямо из приложения нет. Вместо этого весь контент писем идет сплошным текстом к созданному sendmail каналу (pipe).
Приведу очень простой пример:
from django.conf import settings
from django.utils.encoding import smart_str
import os
def sendmail(to, subject, body):
p = os.popen('/usr/bin/sendmail -t', 'w')
p.write("MIME-Version: 1.0\n")
p.write("Content-Type: text/html;charset=utf-8\n")
p.write("To: %s\n" % to)
p.write(smart_str("From: %s\n" % settings.EMAIL_FROM))
p.write(smart_str("Subject: %s\n" % subject))
p.write("\n")
p.write(smart_str(body))
p.close()
Такой скрипт не будет работать на windows, я не видел пакета sendmail в этой операционной системе. Да и я не встречал серверов Windows, на которых бы хостились django приложения.
Я не написал чего мы лишаемся при таком подходе. Мы не можем определить какие письма были успешно доставлены, а какие нет.
Разместил: Виталий Волков в 14:03 Март 19, 2010. Комментарии выключены
Рубрики: Без рубрики. Теги: django, sendmail, мысли.
Буквально пару дней назад я выложил пакет с набором классов, которые позволяют сжимать скрипты в один файл, используя yui или google closure compiler. Продолжая развитие темы хочу сообщить что в пакете теперь присутствуют теги для django приложений. Я не буду расписывать как их использовать, это достаточно расписано в README файле репозитория. Вы еще не знаете в каком?
git@github.com:hash3g/jccompressor.git
Пользуйтесь на здоровье :)
Разместил: Виталий Волков в 20:03 Март 18, 2010. Комментарии выключены
Рубрики: Без рубрики. Теги: build, css, django, js, сжатие скриптов.
Нашел замечательный плагин для emacs, который позволяет легко и непринужденно посылать сообщения в мой jabber аккаунт. Конечно одним jabber я не ограничился и в основном использую google talk для разговора с собеседниками.
Для установки следует скачать пакет с официального сайта.
Итак вы скачали и распаковали архив, приступим к внедрению плагина в наш любимый редактор.
Я люблю, когда все плагины находятся в директории ~/.emacs.d и считаю это правильным, но ничего не мешает вам ложить его куда угодно.
В ваш .emacs файл пропишем строки
(add-to-list 'load-path "/path/to/your/emacs-jabber")
(require 'jabber-autoloads)
Обычно при внедрении нового плагина я рестартую редактор, но если вы знаете, как применить изменения, не делая перезапуска буду рад услышать. Итак редактор перезапущен и следующий шаг это добавить свои jabber-аккаунты.
M-x jabber-customize
Для настройки google talk аккаунта я использовал такие данные:
JID: GmailID
Network server: talk.google.com
Port: 5223
Connection type: Legacy SSL/TLS
Все, осталось сохранить параметры и выполнить M-x jabber-connect для одного аккаунта или M-x jabber-connect-all, если вы хотите активировать все заведенные аккаунты.
Чтобы при запуске постоянно не коннектится к jabber я прописал в самый конец своего .emacs строку (jabber-connect-all)
Приятного вам общения через ваш любимый редактор :)
Разместил: Виталий Волков в 13:03 Март 18, 2010. Один комментарий... »
Рубрики: Без рубрики. Теги: emacs, jabber.
В наших проектах всегда используется n-ное число клиентского кода, как js, так и css. Но на боевые сервера данные скрипты должны попадать сжатыми каким-нибудь компрессором. Каждый раз при обновлении css, добавлении нового js функционала приходится пересжимать скрипты по новой и отдавать клиенту. Это не самый лучший вариант. Поэтому был написан класс, который собирал все скрипты в один файл и травил его компоновщику. На стороне клиента оставалось только сделать апдейт скриптов и изменить версию файла и компоновщик сам пересобирал и сжимал скрипты через yuicompressor.
Функционал будет постепенно дополняться. Так к примеру в планах внедрить разбиение скриптов по размеру (IE имеет привычку не грузить css файл полностью если он превышает определенный размер).
Самую последнюю версию можно забрать с github’а
git clone git@github.com:hash3g/jccompressor.git
Разместил: Виталий Волков в 18:03 Март 16, 2010. Комментарии выключены
Рубрики: Без рубрики. Теги: css, js, сжатие скриптов.
Допустим, у вас есть модель, которая хранит состояние в базе данных, данная модель связана с пользователями. Но как быть в случае неавторизованного пользователя? Хранить состояние в кукисах браузера. Для этого пришлось бы пробежаться по модулю и ставить проверки, добавлять новые методы, переменные. В итоге код превратится в сплошной if… else, а оно нам надо? «А что делать?» — спросите вы. (Надеюсь что не спросите =) Без паники! Я, как-а-вот, ваш спаситель, расскажу и покажу на выход.
Выход — сделать фейковую модель и орудовать ею, как и с обычной джанговской моделью.
Пример
class UserBasket(models.Model):
user = models.ForeignKey(User)
shakedtimes = models.IntegerField(default = 0)
Тогда нашей фейковой моделью будет
class AnonymousBasket(object):
def __init__(self, request, response):
self.shakedtimes = request.COOKIES.get('sk_times', '0')
self.response = response
Теперь в классе можно просто в одном месте добавить проверку на авторизованного пользователя. Но помимо получения значений, рабочий модуль может выполнить операцию сохранения. С моделью то ясно, жанга все сделает за нас, а вот фейковое сохранение надо прописать ручками.
def save(self):
self.response.set_cookie('sk_times', self.shakedtimes)
Красяво? Думаю да. Минусом выступает то что в фейковую модель необходимо передать объект запроса и ответа, но как вы собрались считывать и сохранять куки, а? А? То-то же.
Разместил: Виталий Волков в 20:12 Декабрь 12, 2009. Комментарии выключены
Рубрики: Без рубрики. Теги: code refactoring, cookies, django, python.
На балконе нашего здания, где мы находимся всегда стояла баночка для окурков, ну чтобы не сорить. Сегодня заметил что баночки-то нет и люди выходящие покурить бросают окурки на то место, где она была раньше. На такое наблюдать конечно забавно. Извините, а если у них в сортире убрать унитаз, они продолжуть срать в то место?
Разместил: Виталий Волков в 15:07 Июль 30, 2009. Комментарии выключены
Рубрики: Без рубрики.
Киев замечательный город. Где еще можно увидеть в центре большого города гитариста, который поет Сплина, и кучу молодых людей, которые громко ему подпевали? И все это почти в 9 часов вечера.
Гитаристу просто огромный респект!
Разместил: Виталий Волков в 10:07 Июль 27, 2009. Комментарии выключены
Рубрики: Без рубрики.
Случайно обнаружил, что окна в оболочке Gnome можно тягать, зажав кнопку Alt и перемещая мышь.
Разместил: Виталий Волков в 21:07 Июль 20, 2009. Комментарии выключены
Рубрики: Без рубрики.
Буквально на днях приобрел для себя внешний винчестер с расчетом на то, что в основном я этот винчестер буду в большинстве своем использовать под MacBook.
Другим для меня свойством было то что интернет у меня дома Волевский и на нем много не скачаешь. Поэтому подключать винт как минимум необходимо было и на моей рабочей машине, на которой стоит Ubuntu. И тут натолкнулся на грабли.
Первым делом отформатировал винчестер на HFS через дисковую утилиту. Отформатировал не подумавши с поддержкой журналирования, а драйвер на линуксе журналирование не поддерживал. Пришлось повторно очищать под обычный HFS (Mac OS Extended)
Второе стало то что после этого писать получалось с линукса только пользователю root. Починил это добавив запись в fstab файл:
/dev/sdb12 /home/hash3g/data auto rw,exec,auto,users 0
После этого перемонтировал диск и спокойно смог писать уже в линуксе.
Разместил: Виталий Волков в 15:07 Июль 20, 2009. Комментарии выключены
Рубрики: Без рубрики. Теги: hfs+, linux, mac osx.
Книги читать полезно, они развивают сознание, расширяют твой кругозор, вот мне лично стыдно за то, что я не прочитал Властелина Колец еще до его премьеры в кино. Каюсь.
Разместил: Виталий Волков в 02:07 Июль 17, 2009. Комментарии выключены
Рубрики: Без рубрики.