Показаны сообщения с ярлыком e-commerce. Показать все сообщения
Показаны сообщения с ярлыком e-commerce. Показать все сообщения

пятница, 12 апреля 2013 г.

django-lfs: установка на Windows 7

Установка django-lfs  подробно описана здесь

Но у установки под windows есть несколько особенностей, которые не описаны на официальном сайте

Исходные данные:

  • windows7 64 bin
  • python 2.7 , установленный , например в c:\Python27
Требуется установить django-lfs (на текущий момент версия 0.7.7)

  1. качаем инсталлятор http://pypi.python.org/pypi/django-lfs
  2. распаковываем куда нам нужно
  3. cd lfs-installer
  4. качаем правильный bootstrap.py 
  5. python bootstrap.py
  6. качаем win-инсталлятор для библиотеки PIL (так как установщик ругнется на отсутствие батника vcvarsall.bat)
  7. создаем ключ в реестре HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Python\PythonCore\2.7\InstallPath со значением, которое копируем из ключа  HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.7\InstallPath  - без этой манипуляции инсталлятор PIL "ругнется"  Python27 not found
  8. удаляем Pillow из списка зависимостей djanfo-lfs (файл: lfs-installer\eggs\django_lfs-0.7.7-py2.7.egg\EGG-INFO\requires)
  9. устанавливаем PIL
  10. bin/buildout.exe -v
  11. указываем параметры доступа к базе данных (предполагается, что она уже создана)  в settings to lfs_project/settings.py
  12. $ bin/django syncdb
  13. $ bin/django lfs_init
  14. $ bin/django collectstatic
  15. $ bin/django runserver
  16. Открываем дефолтный магазин http://localhost:8000 и торгуем :)

среда, 7 ноября 2012 г.

Немного о том, как я перепиливал django-lfs

Некоторое время назад, когда передо мной встала задача создания интернет-магазина на django я разрывался между несколькими вариантами дальнейших действий:
    1. django-satchmo
    2. django-lfs 
    3. django-shop (недоделанный)
    4. сделать все самому с нуля
Будь у меня побольше время на тот проект, то , скорее всего , я бы остановился на варианте "сделай сам". 
Но в итоге выбор пал на django-lfs, потому что он мне показался проще в установке и сразу из коробки , там что-то даже полноценно работало =)

Довольно скоро после начала попыток создания данного конкретного магазина на lfs стало ясно, что допиливать придется , и допиливать много. Вот краткий список того, что было доделано-переделано:
  1. добавлен механизм новостей (на основе переработанного под SEO модуля django-diario)
  2. добавлен ротатор баннеров
  3. добавлены товары-"новинки"
  4. упрощена работа с адресами
  5. добавлен механизм персональных скидок зарегенным пользователям магазина
  6. расширен модуль "способы доставки" (для возможности иметь адрес доставки опциональным  в зависимости от способа доставки)
  7. добавлен модуль "FAQ"
  8. добавлен модуль "Рекламные кампании"
и еще куча доработок и переделок по - мелочи - все это, естественно, с поддержкой в manage интерфейсе, что требовало дополнительного кропотливого "встраивания".

В перспективе еще много фич задумано...

В целом lfs довольно функционален и много, чего умеет. При знакомстве с внутренней архитектурой, порой, я был недоволен, но приходилось встраиваться в то, что есть. Пилить пришлось много. 

Не уверен, что пришлось бы меньше потеть, возьми я ,  кпримеру satchmo. И наоборот, уверен, что с учетом трудозатрат на ознакомление и допиливание с нуля проект делался бы дольше, начни я делать все с нуля. Правда и "костылей" бы в нем не было, какие , признаться есть сейчас и ожидают очередни на рефакторинг =)

Бытует мнение , что всякий подобный продукт в любом случае придется кастомизировать под заказчика, и не всегда будет складываться так, что архитектура продукта позволит это сделать безболезненно. Это касается не только django-магазинов. Думаю, для всяких джумл с виртуемартами это справедливо в той же или даже большей степени. Что косвенно подтверждают многочисленные отзывы php-разработчиков.

Вывод - если есть время и бюджет , то делать надо с разумного нуля, компонуя решение из более мелких , а также самодельных django-приложений

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


суббота, 20 октября 2012 г.

django-lfs: ошибка при управлении остатками

Если при добавлении в корзину товара вы натолкнулись на следующее сообщение об ошибке


TypeError at /product-form-dispatcher

unsupported operand type(s) for /: 'float' and 'NoneType'
Request Method:POST
Request URL:http://test/product-form-dispatcher
Django Version:1.4.1
Exception Type:TypeError
Exception Value:
unsupported operand type(s) for /: 'float' and 'NoneType'
Exception Location:/home/projects/eshop/pydocs/deploy/../lfs/catalog/models.py in get_amount_by_packages, line 780
Python Executable:/usr/sbin/uwsgi
то скорее всего дело в том, что для данного товара вы не указали packing_unit . Этот параметр необязателен, и такое поведение - несомненный баг. Открываем catalog/models.py и правим багу в функции get_amount_of_packages:


780,781c780,781 
< packages = math.ceil(quantity / pu) 
< return packages * pu 
--- 
> packages = math.ceil(quantity / self.packing_unit) 
> return packages * self.packing_unit

вторник, 5 июня 2012 г.

django-lfs: опыт использования. часть 2 (темы)

Итак, нам удалось запустить тестовый сервер тестового проекта. Понятно, что стандартный внешний вид нас не устроит.
Что можно сделать, чтобы его изменить?
Надо воспользоваться так называемым механизмом "схем". Схема - это обычное django приложение , которое надо создать самому, создать в нем структуру шаблонов, аналогичную структуре шаблонов стандартной lfs-схемы (см. приложение django-lfstheme)

cd /path/to/lfs_project
python manage.py startapp custom_lfstheme
cp -r /path/to/lfstheme/application/templates ./custom_lfstheme

далее в settings.py надо добавить зависимость от этого приложения (INSTALLED_APPS), поместив его ДО 'lfstheme':

INSTALLED_APPS = (
#...
    "custom_lfstheme",
    "lfstheme",
#...
)

Вот в общем-то вся подготовка к кастомизации внешнего вида. Далее надо просто видоизменять (переписывать с нуля) скопированные шаблоны.

Ну и для того, чтобы пополнить список "несовместимостей" с django 1.4: Может вылезти и обязательно вылезет следующая ошибка (при использовании) admin интерфейса lfs:
You cannot add messages without installing 
django.contrib.messages.middleware.MessageMiddleware
Лечится просто - добавляем нужные миддлваре в settings.py проекта:

MIDDLEWARE_CLASSES = (
#...
    'django.contrib.messages.middleware.MessageMiddleware',
#...
)

понедельник, 28 мая 2012 г.

django-lfs: опыт использования. часть 1 ( установка )

Потребовалось сделать небольшой проект - интернет-магазин на django.
Остановил свой выбор на решении django-lfs.
Беглый осмотр исходников навел на мысль о том, что поддержки новой django 1.4 пока нет - взять хотя бы структуру проекта. Она явно не соответствует той структуре , которую создает django_admin.
Также вижу, что в settings.py не все так, как принято теперь в дефолтном джанго-приложении.
Есть соблазн использовать django 1.3, но спортивный интерес и желание разобраться со всеми проблемами совместимости, которые вылезут, подталкивает начинать именно с 1.4...
Итак, что у нас имеется?
  1. Linux Debian Lenny 32 bit
  2. Python 2.7
  3. virtualenv
  4. django-lfs-installer-0.7.4.tar.gz
  5. MySQL
Сразу готовимся с будущему копипасту )) Создаем фейковый проектик из-под django 1.4 для того, чтобы под рукой иметь эталон. Очень будет полезно для приведения lfs-ного settings к потребному для 1.4 виду. Сделали? Двигаемся дальше.
Далее создадим бд (предполагается что сервер mysql уже крутится на сервере). Логинимся на локальный mysql-сервер под рутом субд и выполняем sql:

--создание базы данных
create database shop_db;
--создание пользователя и выдача ему всех прав на эту бд
grant all privileges on shop_db.* to shop_admin@localhost identified by 'very_hard_to_brake_password' with grant option;

Начнем.
Фазу установки виртуального окружения , распаковки архива, пожалуй , опущу. Отмечу только, что перед синхронизацией БД (syncdb) не забываем прописать настройки доступа к СУБД в settings.py. Остальные первичные телодвижения, которые надо сделать неплохо описаны здесь.
Естественно ни у кого никогда сразу все не ставится. Первое, что мне потребовалось доставить - модуль gunicorn :

#не забываем ставить пакеты при активированном вирт.окружении
easy_install gunicorn

Второе, на что ругнулся скрипт синхронизации БД - отсутствие MySQLdb. ИЗИ_инсталлами он не ставится. Качаем с surceforge последний тарболл MySQL-python-1.2.3.tar.gz , распаковываем, и ставим

wget "длинный дайрект линк с сорцфорж"
tar xvfz MySQL-python-1.2.3.tar.gz
cd MySQL-python-1.2.3
python ./setup.py install

Итак, база синхронизована (syncdb), магазин проиницализирован (lfs_init), тестовый сервер запущен. Открываем. И, судя по всему, видим первый "баг совместимости". В данном случае совместимости дефолтных настроек от джанги старых версий с новой джангой.

Module "django.core.context_processors" does not define a "auth" callable request processor

Исправляется просто. Открываем settings.py, ищем список TEMPLATE_CONTEXT_PROCESSORS , комментируем (если страшно)или удаляем :

TEMPLATE_CONTEXT_PROCESSORS = (
#...some processors here
    'django.contrib.auth.context_processors.auth',
#    'django.core.context_processors.auth',
#...some processors here
)

Запускаем тестовый сервер. Обновляем страницу. И, "следующий сказал заведующий". Другая ошибка:

Error importing template source loader django.template.loaders.filesystem.load_template_source: "'module' object has no attribute 'load_template_source'

Помните, я выше советовал создать проект-пустышку ? открываем его settings.py, копируем целиком оттуда список TEMPLATE_LOADERS и заменяем им аналог в settings.py нашего lfs-ного магазина.

#список шаблонозагрузчиков должен выглядеть так
TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.Loader',
    'django.template.loaders.app_directories.Loader',
#     'django.template.loaders.eggs.Loader',
)

Перезапускаем тестовый сервер или даем ему самому перезапуститься. И эврика, ничего толком не делали и уже видим готовый интернет-магазин )) Шучу, конечно, нам его еще допиливать и допиливать до "требований заказчика".
На этой мажорной ноте "часть первую", пожалуй закончу. Если у кого, вылезло, что-то еще в ходе описанных стадий, о чем я не упомянул - милости прошу поделиться)