четверг, 17 декабря 2015 г.

python mailers

Совсем простой вариант - через email
https://docs.python.org/2/library/email-examples.html

Можно взять небольшую обёртку mailer, но размер кода оно сильно не уменьшит, а зависимость добавит.

Ими легко слать через системный почтовик и системные очереди. Если требуется подключаться к тому же gmail - код несколько усложняется - добавляются шаги авторизации, starttls итд, и тогда добавляется библиотека smtplib (или всякие yagmail)

Когда требуется поддержка юникода, добавляется она не сложно, только надо помнить что некоторые заголовки типа Subject, From, To требуют особого кодирования, недопустимо просто писать юникод-строку, так делают только быдлокодеры. Должно быть так:
from email.header import Header
msg = MIMEMultipart()
msg['Subject'] = "%s" % Header(subject, 'utf-8') - вообще тут надо отделить имя от адреса и преобразовать только имя, или наоборот склеивать преобразованное имя с адресом. Под рукой нет готового примера. При этом итоговый вариант будет таким:
From: =?UTF-8?B?0J0J0J0J0J0J=?= <mail@mail.me>

С текстом проще
msg.attach(MIMEText(text, 'plain', "UTF-8"))
msg.attach(MIMEText(html, 'html', 'UTF-8'))


Если используются фреймворки типа flask, там обычно есть свои обёртки/реализации, тот же flask-mailer
Также есть пакеты для более массовой рассылки, на базе шаблонов, тот же pymassmailer

среда, 16 декабря 2015 г.

decoder jpeg not available (вариант encoder libtiff not available)

доставить библиотеки
yum install libjpeg-devel
yum install freetype-devel
yum install libpng-devel

также может требоваться конкретная версия либы
yum install libjpeg-devel zlib1g-devel libpng12-devel

sudo aptitude install libjpeg62 libjpeg62-dev zlib1g-dev
sudo apt-get install libjpeg8-dev

в особо запущенных случаях
sudo ln -s /usr/lib/x86_64-linux-gnu/libjpeg.so /usr/lib

pip uninstall pil
pip install pillow

если уже стояло
# reinstall pillow
pip install --no-cache-dir -I pillow

SQLAlchemy Custom Types

http://docs.sqlalchemy.org/en/latest/core/custom_types.html
http://docs.sqlalchemy.org/en/latest/orm/composites.html

Допустим, есть у нас задача - на лету переводить столбец uuid в unhex-представление.
class HashColumn(VARBINARY):
  def bind_expression(self, bindvalue):
  #bindvalue = type_coerce(bindvalue, Binary)
  return func.unhex(func.replace(bindvalue, '-', ''))

  def column_expression(self, col):
    return func.lower(func.hex(col))

def select(table_name):
  table = Table(table_name, self.metadata, Column("uuid", HashColumn(20)), autoload=True, extend_existing=True)
  select = table.select()
  ...
Казалось бы, тут был бы логичнее TypeDecorator, но..

<Elmer> oh yeah that TypeDecorator doesn't work because the process_bind_param and process_result_value methods should be Python code, func.hex/func.unhex create SQL function calls

Правильно создаём table и получаем автоматом преобразование.

http://stackoverflow.com/questions/33923914/python-sqlalchemy-binary-column-type-hex-and-unhex/33925980#33925980
http://stackoverflow.com/questions/34039039/python-sqlalchemy-binary-column-type-hex-and-unhex-with-autoloaded-table

вторник, 8 декабря 2015 г.

python: inline картинки

Суть:

msgRoot = MIMEMultipart('related')
html = """\
    <p>This is an inline image<br/>
        <img src="cid:image1">
    </p>
"""
msgHtml = MIMEText(html, 'html')

Подробнее:

пятница, 4 декабря 2015 г.

InsecureRequestWarning: Unverified HTTPS request is being made.

При использовании requests, даже когда выставляем verify=False, в логи может сыпать варнингами
InsecureRequestWarning: Unverified HTTPS request is being made.

Как отключить этот crap:
https://urllib3.readthedocs.org/en/latest/security.html#disabling-warnings

в случае прямого использования urllib3
import urllib3
urllib3.disable_warnings()

В случае requests
import requests.packages.urllib3 as urllib3
urllib3.disable_warnings()

четверг, 3 декабря 2015 г.

python+mysql

во 2 питоне есть MySQLdb, в 3 его нет. Самая простая замена:
import pymysql
pymysql.install_as_MySQLdb()

Более полный список вариантов

вторник, 11 августа 2015 г.

Делаем цветной вывод логов

Самый простой вариант -- используя цветовые коды и print
print u"\x1b[31;40mЧто-то красное на чёрном\x1b[0m"

Но использовать такую конструкцию очень сложно, особенно если цветовых вариантов больше одного. Да и замена цвета будет той ещё головной болью...
Можно составить "карту" цветов и использовать в виде переменных (или подключить colorama), но это очень неудобно. Примеры в комментах. Или.
Особенно, когда нужно несколько цветов по разным уровням ошибки, и появляется обёртка вида
def mylog-red-black(string):
    print u"\x1b[31;40m%s\x1b[0m" % (string,)
....