Django проект: с нуля до работающего сервера

В этом посте хочу описать свой опыт создания и запуска django проекта на VPS-хостинге.

Разделим задачу на этапы:

  1. Создание django-проекта
  2. Настройка деплоя
  3. Настройка сервера (установка нужных библиотек)
  4. Деплой проекта

Создание django-проекта

Итак. Пусть наш проект называется myproject. Создадим его на локальном компьютере. Будем считать, что python у нас в системе установлен. Для начала нам понадобятся pip и virtualenv (если еще не стоят).

Создаем виртуальное окружение:

virtualenv venv-myproject

Активируем его:

# на *nix системе
source venv-myproject/bin ...

Добавлено 2013-11-13

Настройки логов для django

Рассмотрим дефолтные настройки логов в django и попробуем их сделать максимально удобными.

Вот что есть в settings.py после команды django-admin.py startproject project_name (django 1.5):

# A sample logging configuration. The only tangible logging
# performed by this configuration is to send an email to
# the site admins on every HTTP 500 error when DEBUG=False.
# See http://docs.djangoproject.com/en/dev/topics/logging for
# more details on how to customize your logging ...

Добавлено 2013-09-26

Python logging на каждый день

В процессе написания программы, скрипта, часто бывает нужно вывести какую-либо отладочную информацию или сообщить о каком-то событии. Известно, что для этих целей есть встроенный модуль logging. Однако обычно у меня бывает так: времени в обрез, а все эти настройки логов (handlers, loggers, formatters и пр.) никак не могу запомнить, и на скорую руку вставляю просто print. Потом, если скрипт используется часто или его надо отдать заказчику - хочется чтобы все эти сообщения записывались в файл ...

Добавлено 2013-08-20

Кеширование queryset.count в django

Кеширование queryset.count в django

Как-то обнаружил, что у меня идут несколько одинаковых запросов вида 'SELECT COUNT(*) ...'. Оказалось (да, для меня это было новостью :) ), что метод queryset.count() в джанго кешируется по особому. Но лучше начать рассказ издалека.

Как известно, объекты queryset у ORM django являются "ленивыми", а так же кешируются.

Т.е., преподолжим у нас такая модель:

class Item(models.Model):
    name = models.CharField(max_length=50)

Тогда при создании запроса фактически обращения к БД не происходит (отсюда название lazy ...

Добавлено 2013-07-11

Форматирование unicode строк

Вы знали, что если одно из значений строкового выражения с оператором % - unicode, то вся результирующая строка будет тоже unicode?

>>> "Hello, %s" % u"Alex"
u'Hello, Alex'
>>> "Hello, %s" % u"Алексей"
u'Hello, \u0410\u043b\u0435\u043a\u0441\u0435\u0439'

Я привык пользоваться методом .format для форматирования строк и его поведение мне больше нравится: тип исходной строки всегда сохраняется, а если в качестве параметра даются не ascii символы, то возбуждается исключение UnicodeEncodeError.

>>> "Hello, {0}".format(u ...

Добавлено 2013-06-20

Парсинг url'а, содержащего unicode параметры, используя urlparse.parse_qs

Задача: получить словарь параметров URL'a. Например, имеем адрес:

http://example.com/?key=value&a=b

и нужно получить такой словарь:

{'key': ['value'], 'a': ['b']}

Тут значения являются списками, т.к. у одного ключа может быть несколько значений:

In: http://example.com/?key=value&a=b&a=c
Out: {'key': ['value'], 'a': ['b', 'c']}

В python'е для этих целей есть функция urlparse.parse_qs, которая делает следующее:

>>> import urlparse
>>> query = "key=value&a=b"
>>> urlparse ...

Добавлено 2013-05-22

Оптимизация админки django

Оптимизация админки django

Как известно, чем меньше запросов к базе данных делает сайт, тем лучше производительность. Обычно админка - часть сайта с меньшим трафиком, но все же хорошо, если от туда не идут лишние запросы. Это и приятней в пользовании, т.к. страница отдается быстрее, и все-таки разгружает сервер.

В этом посте я рассмотрю некоторые способы уменьшения количества запросов из админки к БД при использовании __unicode__, содержащего поля связанного объекта (ForeignKey). Думаю, глядя на примеры станет понятнее.

1. __unicode__ ...

Добавлено 2013-04-12

Функции с изменяемыми значениями по умолчанию в python'e

Python mutable default arguments

В python'е значения функции по умолчанию создаются в момент выполнения инструкции def, а не при каждом вызове функции. Если значение - неизменяемый объект (например строка, целое число, кортеж), то никаких подводных камней здесь нет. А вот если объект изменяемый (например список), то есть возможность попасть в ловушку. Вот пример:

    def foo(l=[]):
        l.append('x')
        return l

Казалось бы, при каждом вызове foo() будет возвращаться список ['x']. Но:

    >>> foo()
    ['x']
    >>> foo()
    ['x', 'x']
    >>> foo()
    ['x ...

Добавлено 2013-03-05

Многоязычный сайт на django без редиректов

Начиная с django 1.4, можно задать префикс для url для каждого включенного языка. К примеру, мы хотим сайт, который будет иметь русскую и английскую версию.

Для этого добавляем в settings.py:

    # язык сайта по умолчанию, если не удалось определить язык другими способами
    LANGUAGE_CODE = 'ru'

    # список доступных языков
    LANGUAGES = (
        ('ru', 'Russian'),
        ('en', 'English'),
    )

    # включаем систему перевода django
    USE_I18N = True

    # указываем, где лежат файлы перевода
    LOCALE_PATHS = (
        os.path.join(PROJECT_DIR, 'locale'),
    )

    # Добавляем LocaleMiddleware
    MIDDLEWARE_CLASSES = (
       # ...
       'django.middleware ...

Добавлено 2013-02-26

Скрипт для скачивания музыки вконтакте

Vkontakte audio download

Беглый поиск соответствующего скрипта на python'е не дал результов. В статье на хабре ссылка не работает. Решил написать свой велосипед, он доступен здесь.

Запуск (нужен установленный python интерпретатор):

python vkcom_audio_download.py

Проверял на python 2.6 и 2.7. Никаких дополнительных библиотек не требуется.

Принцип работы:

Скрипт проверяет сохраненный access_token. Если его нет или срок истек, то открывается страница в браузере с запросом на доступ к данным аккаунта (аудио записям). После подтверждения идет ...

Добавлено 2013-02-04

Sublime text и github gists

Sublime text and github gist

В Sublime text есть огромное количество полезных инструментов, помогающих быстро писать код. Пока я изучил лишь небольшую их часть, в том числе пытаюсь привыкнуть к Vintage mode (управление курсором в стиле vim). Но сейчас хочу рассказать о другом - об интеграции github gists с sublime text. Если вы не знаете, github gists позволяет сохранять скрипты, снипеты в виде отдельного файла, чтобы не создавать для этого целый репозиторий. При этом поддерживаются многие функции репозитория - версии, возможность форка ...

Добавлено 2013-01-03

MobileESP: Скрипт определения мобильного устройства посетителя

Скрипт полезен, если вы хотите показывать разные версии сайта для обычных компьютеров и мобильных устройств. Большое количество методов для определения вида девайса. Доступен на разных языках программирования, включая python. Собственно порт на python был написан мной по просьбе freelance заказчика.

Так его можно использовать в django проекте:

from mobileesp import mdetect

user_agent = request.META.get("HTTP_USER_AGENT")
http_accept = request.META.get("HTTP_ACCEPT")
if user_agent and http_accept:
    agent = mdetect.UAgentInfo(userAgent=user_agent, httpAccept=http_accept)
    # устройство посетителя - новый ...

Добавлено 2012-11-29

Отладка django проекта с помощью встроенного python отладчика pdb

Я использую sublime-text в качестве редактора python кода. В нем нет встроенного отладчика, поэтому для отладки django проектов я в основном делал так:

print var_name

и в консоле локального сервера смотрел вывод команды. Я использую этот метод и сейчас, но иногда хочется пройтись по коду по шагам, посмотреть все переменные.

Это можно сделать с помощью встроенного python отладчика pdb:

import pdb; pdb.set_trace()

Т.е. мы вставляем эту строку в то место в коде, где ...

Добавлено 2012-11-18

Облачный сервис Openshift

Openshift логотип

Я знаю немного хостингов с бесплатным тарифом и с поддержкой python. Это Google App Engine и Alwaysdata. И вот недавно узнал про замечательный проект Openshift от RedHat, на котором и работает этот блог. Для начала небольшой обзор упомянутых хостингов.

Google app engine

Основной недостаток google app engine - ограниченный набор библиотек, которые можно использовать. Конечно, чисто python библиотеки можно ставить, но те, которые требуют C компиляции - нет. К примеру, не получится использовать pycurl. Так же на ...

Добавлено 2012-10-08

Мессенджер афоризмов

Мессенджер афоризмов

У меня есть интересный проект, которым хотел бы поделиться. Идея создать его возникла во время изучения Java. Прочел я несколько книжек, сделал маленькие программки-задания и захотелось сделать нечто большее.

Суть проекта:

Есть desktop-программа (клиент), которая сидит в трее, и периодически показывает афоризмы. Афоризмы она берет с web-сервиса (сервер), таким образом база цитат находится в одном месте. Т.е. база не привязана к клиенту, я могу обновить ее на сервере и все клиенты это заметят. У ...

Добавлено 2012-08-31

Этот сайт

Особенности:

  • работает на python+django
  • дизайн twitter bootstrap
  • в основе мой форк django-articles-transmeta блог-движка django-articles. В форке добавлена возможность перевода статей (джанго моделей)
  • работает в облаке на openshift
  • есть полнотекстовый поиск, сделан с помощью haystack + whoosh
  • многоязычность (русский и английский)
  • код лежит на github

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

Добавлено 2012-08-28