17. Конфигурация и настройки
26 октября 2016 г. 14:05
Сам фреймворк djangoSHOP требует всего несколько директив. Однако, каждый интернет-магазин строится вокруг djangoSHOP, который состоит из собственного приложения продавца и содержит коллекцию сторонних Django приложений. В этом разделе мы рассмотрим конфигурационные настройки приложений:
17.1. Настройки DjangoSHOP
17.1.1. Название приложения
Это название требуется для конфигурации имён таблиц в базе данных, а также для реализации торговли.
SHOP_APP_LABEL = 'myshop'
17.1.2. Альтернативная пользовательская модель
Во встроенной модели пользователя в Django не хватает несколько функций, которые требуются для djangoSHOP: в основном, возможность использовать эл. почту как логин для входа на сайт. Эта переопределяемая модель на 100% совместима со встроенной модели пользователя Django и даже переиспользует саму таблицу auth_user в базе данных.
AUTH_USER_MODEL = 'email_auth.User'
Так как эта модель пользователя намеренно не обеспечивает уникальность email адресов, то нужно отметить, чтобы Django "молчаливо" реагировал на данное предупреждение:
SILENCED_SYSTEM_CHECKS = ('auth.W004')
Более подробную информацию смотрите в разделе Модель покупателя.
17.1.3. Authentication Backends
AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', 'allauth.account.auth_backends.AuthenticationBackend', )
17.1.4. Currency
Для указания типа Money мы можем воспользоваться следующей константой:
SHOP_DEFAULT_CURRENCY = 'EUR'
$ 1.23 - типичный формат для рендера суммы, но некоторые продавцы предпочитают 1.23 USD. Используя следующую настройку
SHOP_MONEY_FORMAT = '{symbol} {amount}'
мы можем указать конкретный формат вывода, где {symbol} - это €, $, £ и т. д. и {currency} - это EUR, USD, GBP и т. д.
17.1.5. Модификаторы корзины
Каждый проект требует по крайней мере один модификатор для инициализации корзины. В большинстве реализаций shop.modifiers.defaults.DefaultCartModifier будет достаточно, но в зависимости от моделей продукта, продавец может захотеть альтернативную реализацию.
Для идентификации налогов в корзине, используйте один из предоставленных налоговых модификаторов или создайте свой.
Другие модификаторы могут добавлять дополнительные стоимости оплаты и доставки, или пересчитывать общую стоимость при любых обстоятельствах.
SHOP_CART_MODIFIERS = ( 'shop.modifiers.defaults.DefaultCartModifier', 'shop.modifiers.taxes.CartExcludedTaxModifier', # other modifiers )
Более подробную информацию смотрите в разделе Модификаторы корзины.
17.1.6. Установленные Django приложения
Имеется конфигурация, которая работает. Специальные и дополнительные приложения обсуждаются ниже.
INSTALLED_APPS = ( 'django.contrib.auth', 'email_auth', 'polymorphic', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'djangocms_admin_style', 'django.contrib.admin', 'django.contrib.staticfiles', 'django.contrib.sitemaps', 'djangocms_text_ckeditor', 'django_select2', 'cmsplugin_cascade', 'cmsplugin_cascade.clipboard', 'cmsplugin_cascade.sharable', 'cmsplugin_cascade.extra_fields', 'cmsplugin_cascade.segmentation', 'cms_bootstrap3', 'adminsortable2', 'rest_framework', 'rest_framework.authtoken', 'rest_auth', 'django_fsm', 'fsm_admin', 'djng', 'cms', 'menus', 'treebeard', 'compressor', 'sekizai', 'sass_processor', 'django_filters', 'filer', 'easy_thumbnails', 'easy_thumbnails.optimize', 'parler', 'post_office', 'haystack', 'shop', 'my_shop_implementation', )
- email_auth опционально, но рекомендуется, переопределяет встроенную аутентификацию. Должно быть добавлено после django.contrib.auth.
- polymorphic необходимо, если в сайте требуется более, чем один тип модели продукта. Требуется установить django-polymorphic.
- djangocms_text_ckeditor опционально, добавляет WYSIWYG HTML редактор, который хорошо интегрирован с djangoCMS.
- django_select2 опционально, добавляет поле выбора (select) в Django админку, которая добавляет автозаполнение. Полезно для ручного добавления ссылок на продукты. Требуется установить django-select2.
- cmsplugin_cascade добавляет функциональность для добавления CMS плагинов, которые предоставляются django-SHOP для заполнения CMS заполнителей.
- cmsplugin_cascade.clipboard позволяет администратору копировать набор плагинов из одного сайта в другой.
- cmsplugin_cascade.sharable позволяет администратору распространять заранеее настроенный конфигурационный набор атрибутов в алиас для переиспользования другими плагинами такого же типа.
- cmsplugin_cascade.extra_fields позволяет администратору добавлять произвольные CSS классы, стили и ID-поля для определённых плагинов.
- cmsplugin_cascade.segmentation позволяет сегментировать набор плагинов в логические единицы.
- cms_bootstrap3 добавляет некоторые шаблоны и шаблонные теги для рендера стилизованного меню и навигационных баров, используя фреймворк Bootstrap 3.
- adminsortable2 позволяет администратору сортировать различные элементы в административной части сайта.
- rest_framework, rest_framework.authtoken and rest_auth, необходимо для REST функциональности в djangoSHOP.
- django_fsm and fsm_admin, необходимо для Машины конечных состояний (Finite State Machine) в djangoSHOP.
- djng необходимо лишь для инсталяции, используя AngularJS, который рекомендуется в качестве JavaScript фреймворка. Добавляет слой интерфейса между Django и AngularJS и требует, чтобы django-angular был установлен.
- cms, menus and treebeard требуются если djangoSHOP используется в сочетании с djangoCMS.
- compressor, настоятельно рекомендуется. Склеивает и минифицирует CSS и JavaScript файлы на боевом сервере. Должен быть установлен django-compressor.
- sekizai, настоятельно рекомендуется и позволяет группировать CSS и JavaScript файлы. Должен быть установлен django-sekizai.
- sass_processor, опционально, но рекомендуется. Используется для конвертации SASS в CSS вместе нформацией отладки. Должен быть установлен django-sass-processor.
- django_filters, опционально, используется для фильтрации продуктов по их атрибуту с использованием параметров запроса.
- filer, очень рекомендуется, управляет вашими медиа-файлами в Django. Должен быть установлен django-filer.
- easy_thumbnails и easy_thumbnails.optimize настоятельно рекомендуется, обрабатывает генерацию миниатюр и оптимизирует их. Должен быть установлен easy-thumbnails.
- parler - опциональный фреймворк, который обрабатывает переводы полей модели на другие языки.
- post_office настоятельно рекомендуется. Приложение по асинхронной отправки почтовых сообщений, который не прерывает цикл запрос-ответ, когда отправляет письмо.
- haystack опционально, обрабатывает интерфейс между Django и Elasticsearch – полнотекстового поискового механизма. Должен быть установлен ElasticSearch, django-haystack и drf-haystack.
- shop - djangoSHOP фреймворк.
- my_shop_implementation - собственная реализация торговли этого интернет-магазина.
17.1.7. Классы промежуточного слоя
Это конфигурация проверена и работает. Специальные классы промежуточного слоя обсуждаются ниже.
MIDDLEWARE_CLASSES = ( 'djng.middleware.AngularUrlMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'shop.middleware.CustomerMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.gzip.GZipMiddleware', 'cms.middleware.language.LanguageCookieMiddleware', 'cms.middleware.user.CurrentUserMiddleware', 'cms.middleware.page.CurrentPageMiddleware', 'cms.middleware.toolbar.ToolbarMiddleware', )
- djng.middleware.AngularUrlMiddleware добавляет специальный маршутизатор для того, чтобы использовать Django реверс-функцию из JavaScript.
- shop.middleware.CustomerMiddleware добавляет объект Customer в каждый запрос.
17.1.8. Статические файлы
Если компрессор и/или sass_processor есть в INSTALLED_APPS, то добавьте их искатели в список STATICFILES_FINDERS
STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', 'sass_processor.finders.CssFinder', 'compressor.finders.CompressorFinder', )
Так как djangoSHOP требует несколько пакетов сторонних приложений, которые не доступны из PyPI, они могут быть инсталированы через npm. Для того, чтобы сделать эти файлы доступными в нашем Django приложении, мы должны использовать следующую настройку:
STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ('node_modules', os.path.join(PROJECT_ROOT, 'node_modules')), )
Некоторые файлы инсталлированные через npm обрабатываются django-sass-processor и, следовательно, их пути должны быть доступны:
NODE_MODULES_URL = STATIC_URL + 'node_modules/' SASS_PROCESSOR_INCLUDE_DIRS = ( os.path.join(PROJECT_ROOT, 'node_modules'), )
17.1.9. Шаблонные процессоры контекста
Шаблоны, которые рендерятся с помощью djangoSHOP, требуют объект Customer в их контексте. Для конфигурации добавьте настройки шаблонные процессоры контекста:
TEMPLATES = [{ ... 'OPTIONS': { 'context_processors': ( ... 'shop.context_processors.customer', 'shop.context_processors.version', ), }, }]
17.1.10. Workflow-миксины
SHOP_ORDER_WORKFLOWS = ( 'shop.payment.defaults.PayInAdvanceWorkflowMixin', 'shop.shipping.defaults.CommissionGoodsWorkflowMixin', # other workflow mixins )
17.1.11. REST фреймворк
REST фреймворк требует специальных настроек. Мы точно должны сообщить ему, как сериализовать наш специальный тип Money:
REST_FRAMEWORK = { 'DEFAULT_RENDERER_CLASSES': ( 'shop.rest.money.JSONRenderer', 'rest_framework.renderers.BrowsableAPIRenderer', ), 'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',), 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination', 'PAGE_SIZE': 12, } SERIALIZATION_MODULES = {'json': str('shop.money.serializers')}
17.1.12. Django CMS и Cascade настройки
DjangoSHOP требует по крайней мере один CMS шаблон. Убедитесь, что он содержит заполнитель.
CMS_TEMPLATES = ( ('myshop/pages/default.html', _("Default Page")), ) CMS_PERMISSION = False
DjangoSHOP обогащает djangocms-cascade несколькими специфическими плагинами для интернет-магазина.
from cmsplugin_cascade.extra_fields.config import PluginExtraFieldsConfig CMSPLUGIN_CASCADE_PLUGINS = ('cmsplugin_cascade.segmentation', 'cmsplugin_cascade.generic', 'cmsplugin_cascade.link', 'shop.cascade', 'cmsplugin_cascade.bootstrap3',) CMSPLUGIN_CASCADE = { 'link_plugin_classes': ( 'shop.cascade.plugin_base.CatalogLinkPluginBase', 'cmsplugin_cascade.link.plugin_base.LinkElementMixin', 'shop.cascade.plugin_base.CatalogLinkForm', ), 'dependencies': { 'shop/js/admin/shoplinkplugin.js': 'cascade/js/admin/linkpluginbase.js', }, 'alien_plugins': ('TextPlugin', 'TextLinkPlugin',), 'bootstrap3': { 'template_basedir': 'angular-ui', }, 'plugins_with_extra_fields': { 'ExtraAnnotationFormPlugin': PluginExtraFieldsConfig(), 'ShopProceedButton': PluginExtraFieldsConfig(), 'ShopAddToCartPlugin': PluginExtraFieldsConfig(), }, 'segmentation_mixins': ( ('shop.cascade.segmentation.EmulateCustomerModelMixin', 'shop.cascade.segmentation.EmulateCustomerAdminMixin'), ), 'plugins_with_extra_render_templates': { 'CustomSnippetPlugin': [ ('shop/catalog/product-heading.html', _("Product Heading")) ], }, }
Так как мы хотим добавлять произвольные ссылки на карточку продукта, django-SHOP предлагает модифицированный плагин Ссылка. И должна быть включена с помощью 3-кортежного link_plugin_classes. Имеется также вспомогательный файл JavaScript shop/js/admin/shoplinkplugin.js, который зависит от другого JavaScript файла.
DjangoSHOP использует AngularJS вместо jQuery для контоля его динамических HTML виджетов. Поэтому мы вынуждены переопределить значение по умолчанию следующей настройкой: CMSPLUGIN_CASCADE['bootstrap3']['template_basedir']
Более подробная информация об этих настройках содержится в разделе djangocms-cascade.
17.1.13. Полнотекстовый поиск
Если вы установили и запустили ElasticSearchEngine, то конифгурация Haystack будет выглядеть следующим образом:
HAYSTACK_CONNECTIONS = { 'default': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://localhost:9200/', 'INDEX_NAME': 'my_prefix-en', }, }
Если вы хотите индексировать другой язык, например, немецкий, то добавьте другой префикс:
HAYSTACK_CONNECTIONS = { ... 'de': { 'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine', 'URL': 'http://localhost:9200/', 'INDEX_NAME': 'my_prefix-de', } } HAYSTACK_ROUTERS = ('shop.search.routers.LanguageRouter',)
17.1.14. Другие различные настройки
Из соображений удобства и простоты использования имеет смысл обновлять изменение корзины только по истечении определенного времени бездействия. Эта конфигурация устанавливает 2500 миллисекунд:
SHOP_EDITCART_NG_MODEL_OPTIONS = "{updateOn: 'default blur', debounce: {'default': 2500, 'blur': 0}}"
Измените подклюённый путь к локальной директории, если вы не хотите загружать статику с CDN:
SELECT2_CSS = 'node_modules/select2/dist/css/select2.min.css' SELECT2_JS = 'node_modules/select2/dist/js/select2.min.js'
Так как на стороне клиента не разрешается делать какие-либо ценовые и количественные расчеты, Decimal значения передаются клиенту с помощью строки. Это также позволяет избежать неприятных ошибок округления.
COERCE_DECIMAL_TO_STRING = True
Запрет на отображения всех переходов, настроенных с помощью workflow-миксинов внутри бэкенда администрирования:
FSM_ADMIN_FORCE_PERMIT = True
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0