31 октября 2013 г.

django: csrf при ajax-запросах

Несколько раз встречал вопросы на счёт csrf при самодельных ajax-запросах (например, через jquery как в примере ниже), и несколько вариантов странных даже видел. Я делаю проще - в основную страницу (например, в шаблон base.html или как он там у вас назван) выношу стандартный csrf_token в качестве javascript-переменной и во всех последующих скриптах удобно его использую.
Секюрность не страдает, конечно, т.к. сам токен не представляет интереса. Потом при запросах, например, через jquery.ajax можно просто передавать как параметр с именем "csrfmiddlewaretoken" (аналогично тому как он передаётся через скрытый input в обычных формах)

$.ajax({
  type: 'POST',
  url: '...',
  data : { ..., 'csrfmiddlewaretoken' : csrf_token, },
  ...
});

21 октября 2013 г.

linux: русский в консоли archlinux

Возникла проблема со шрифтами в виртуальной консоли. Квадратики вместо кириллицы. В графическом эмуляторе терминала, разумеется, всё нормально, а в /dev/ttyX беда. Выяснилось, что всё портит systemd, сначала загружая шрифты и настраивая их согласно vconsole.conf как и положено, а потом подгружая drm-модуль видеокарты, который создаёт новый фреймбуфер (например, у меня /dev/fb0), в котором уже никаких настроек не делается.

7 октября 2013 г.

django: логгирование в файл и перехват warnings

В django иногда удобно вести файловые логи в приложении. По умолчанию настроен только один handler — mail_admins (отправка на мыло админам), что не всегда хорошо, а иногда невозможно (в принципиальном интранете, например). Вторая задача возникла — хорошо бы отлавливать туда же и все варнинги из warnings.warn, которые в том числе и django иногда вываливает.
Первая задача тривиальна и описана в документации. Создаём новый handler RotatingFileHandler и добавляем в нужные логгеры (очевидно, что речь про settings.py):
LOGGING = {
...
    'handlers': {
...
        'logfile': {
            'level': 'WARNING',
            'class': 'logging.handlers.RotatingFileHandler',
            'filename': rel('log', 'logfile.log'),
            'maxBytes': 1000000,
            'backupCount': 666,
            'formatter': 'standard',
        },
...
    },
    'loggers': {
        'django.request': {
            'handlers': ['mail_admins', 'logfile'],
            'level': 'WARNING',
            'propagate': True,
        },
...
    },
}
вторая задача тоже просто решается. Делается
import logging
logging.captureWarnings(True)
После этого все варнинги начинаются писаться также в логгер с именем "py.warnings", откуда их и логируем:
...
    'loggers': {
...
        'py.warnings': {
            'handlers': ['console', 'logfile'],
            'level': 'WARNING',
            'propagate': True,
        },
...
    },

6 октября 2013 г.

django: удобные относительные пути в settings

В settings-файле джанги удобно придумать какой-то порядок, потому что рутинных записей всяких копится целая куча. Например, для работы с путями (которые почти все относительны) использую небольшой трюк.
import os

# путь корня этого проекта (там где manage лежит)
PROJECT_DEPLOY_PATH = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))

rel = lambda *path: os.path.join(PROJECT_DEPLOY_PATH, *path)
Без лямбды функция rel может выглядеть как-то так:
def rel(*path):
    return os.path.join(PROJECT_DEPLOY_PATH, *path)
И далее просто используется:
STATIC_ROOT = rel('static')
Или для путей из нескольких подпапок (/static/files/)
STATIC_ROOT = rel('static','files')