ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

从零构建 django-oscar 商城:Getting Started 完整实战指南

从零构建 django-oscar 商城:Getting Started 完整实战指南 后端电商【免费下载链接】django-oscarDomain-driven e-commerce for Django项目地址https://gitcode.com/gh_mirrors/dj/django-oscar点击查看免费下载本篇技术指南以 django-oscar 官方文档 docs/source/internals/getting_started.rst 为主体完整演示如何从空白项目起步搭建一个可运行、可浏览的 Oscar 商城示例项目名为frobshop。读完本文你将掌握 Oscar 的依赖安装、Django 设置项配置含全部 Oscar 应用与上下文处理器、搜索后端选择、订单状态管道定义等核心能力并能基于仓库源码理解每一项配置背后的实现原理。一、写在前面读懂 Oscar 的集成方式django-oscar 是一个领域驱动的 Django 电商框架项目描述为 Domain-driven e-commerce for Django。它不是一个单体应用而是一组可插拔的 Django app 集合catalogue、basket、checkout、order、offer、dashboard 等通过标准 Django 配置即可组装进你自己的项目。因此“从零构建商城”的本质是先创建一个普通 Django 项目再把 Oscar 的应用、中间件、认证后端、URL 配置逐项接入。官方文档建议若安装过程中遇到问题可以随时对照仓库自带的 Sandbox 站点配置见 docs/source/internals/sandbox.rst 与 sandbox/settings.py进行排错——Sandbox 本身就是一份“可运行的 Oscar 项目”样板。二、安装 Oscar 与依赖2.1 创建虚拟环境并安装官方推荐在虚拟环境中安装。若你使用virtualenvwrapper可以这样开始$ mkvirtualenv oscar $ pip install django-oscar[sorl-thumbnail] $ django-admin startproject frobshop如果你没有mkvirtualenv也可以用 Python 3 自带的venv替代$ python3 -m venv oscar $ . ./oscar/bin/activate (oscar) $ pip install django-oscar[sorl-thumbnail] (oscar) $ django-admin startproject frobshop安装django-oscar时会自动把 Django 作为依赖一并安装。startproject会生成一个名为frobshop的项目目录后续所有配置都围绕它展开。2.2 关于 sorl-thumbnail 与 pillowsorl-thumbnail是可选的但推荐保留。它是 Oscar 默认使用的图片缩略图后端Oscar 的默认模板依赖它生成商品图缩略。文档明确说明它可以被easy-thumbnails或自定义缩略图后端替换但若替换必须同步修改OSCAR_THUMBNAILER设置。仓库默认值位于 src/oscar/defaults.py 第 271 行OSCAR_THUMBNAILER oscar.core.thumbnails.SorlThumbnail。Sandbox 的 sandbox/settings.py 中同时启用了sorl.thumbnail和easy_thumbnails并给出了THUMBNAIL_KVSTORE、THUMBNAIL_REDIS_URL等可调参数。pillowPIL 的分支必须支持 JPEG。安装后打印的 supported formats 会列出支持的格式libjpeg-dev需要预先安装并被编译期发现。由于这是高度平台相关的事项官方建议参考 PIL 的 JPEG 支持指南一般对 pillow 同样适用。注意以下所有 settings 片段均指编辑frobshop/frobshop/settings.py。三、Django settings 配置3.1 导入 Oscar 默认设置在 settings 文件顶部或任意位置导入 Oscar 的全部默认设置from oscar.defaults import *这一行的作用是让所有OSCAR_*开头的默认值如OSCAR_SHOP_NAME、OSCAR_DEFAULT_CURRENCY GBP、分页数量、Cookie 名称、OSCAR_DASHBOARD_NAVIGATION菜单结构等进入你的命名空间。完整默认值清单可以查阅 src/oscar/defaults.py。由于使用星号导入之后你可以直接在 settings 中覆写同名变量来定制行为——这是 Oscar 推荐的定制入口。3.2 添加 Oscar 上下文处理器在TEMPLATES的context_processors中追加以下四个 Oscar 专用处理器oscar.apps.search.context_processors.search_form, oscar.apps.checkout.context_processors.checkout, oscar.apps.communication.notifications.context_processors.notifications, oscar.core.context_processors.metadata,它们分别负责为全站模板注入搜索表单、结算阶段所需的上下文、用户通知数量、以及站点元信息店铺名、标语等。对照 sandbox/settings.py 第 133–147 行可以看到 Sandbox 正是按此顺序配置的。3.3 配置 INSTALLED_APPS 与 SITE_ID将INSTALLED_APPS改为列表形式加入django.contrib.sites、django.contrib.flatpages、Oscar 各核心应用及第三方依赖应用INSTALLED_APPS [ django.contrib.admin, django.contrib.auth, django.contrib.contenttypes, django.contrib.sessions, django.contrib.messages, django.contrib.staticfiles, django.contrib.sites, django.contrib.flatpages, oscar.config.Shop, oscar.apps.analytics.apps.AnalyticsConfig, oscar.apps.checkout.apps.CheckoutConfig, oscar.apps.address.apps.AddressConfig, oscar.apps.shipping.apps.ShippingConfig, oscar.apps.catalogue.apps.CatalogueConfig, oscar.apps.catalogue.reviews.apps.CatalogueReviewsConfig, oscar.apps.communication.apps.CommunicationConfig, oscar.apps.partner.apps.PartnerConfig, oscar.apps.basket.apps.BasketConfig, oscar.apps.payment.apps.PaymentConfig, oscar.apps.offer.apps.OfferConfig, oscar.apps.order.apps.OrderConfig, oscar.apps.customer.apps.CustomerConfig, oscar.apps.search.apps.SearchConfig, oscar.apps.voucher.apps.VoucherConfig, oscar.apps.wishlists.apps.WishlistsConfig, oscar.apps.dashboard.apps.DashboardConfig, oscar.apps.dashboard.reports.apps.ReportsDashboardConfig, oscar.apps.dashboard.users.apps.UsersDashboardConfig, oscar.apps.dashboard.orders.apps.OrdersDashboardConfig, oscar.apps.dashboard.catalogue.apps.CatalogueDashboardConfig, oscar.apps.dashboard.offers.apps.OffersDashboardConfig, oscar.apps.dashboard.partners.apps.PartnersDashboardConfig, oscar.apps.dashboard.pages.apps.PagesDashboardConfig, oscar.apps.dashboard.ranges.apps.RangesDashboardConfig, oscar.apps.dashboard.reviews.apps.ReviewsDashboardConfig, oscar.apps.dashboard.vouchers.apps.VouchersDashboardConfig, oscar.apps.dashboard.communications.apps.CommunicationsDashboardConfig, oscar.apps.dashboard.shipping.apps.ShippingDashboardConfig, # 3rd-party apps that oscar depends on widget_tweaks, haystack, treebeard, sorl.thumbnail, # Default thumbnail backend, can be replaced django_tables2, ] SITE_ID 1几点需要特别说明oscar.config.Shop是总入口。它对应 src/oscar/config.py 中的Shop(OscarConfig)类负责在ready()中聚合 catalogue、customer、basket、checkout、search、dashboard、offer、wishlists 八个子应用并在get_urls()中统一注册/catalogue/、/basket/、/checkout/、/accounts/、/search/、/dashboard/、/offers/、/wishlists/以及密码重置等路由。django.contrib.flatpages不是 Django 默认安装的Oscar 依赖它来渲染静态页面而flatpages又依赖django.contrib.sites因此两者必须同时加入并设置SITE_ID 1。widget_tweaks是可选的——Oscar 默认模板使用它但如果你完全自研模板可以移除。每个 dashboard 子模块reports、users、orders、catalogue、offers 等都有独立的*Config可按需裁剪但保持默认列表最省心。3.4 配置 MIDDLEWARE在MIDDLEWARE中追加两个中间件MIDDLEWARE ( ... oscar.apps.basket.middleware.BasketMiddleware, django.contrib.flatpages.middleware.FlatpageFallbackMiddleware, )BasketMiddleware为每个请求注入一个有效的购物篮实例即使匿名用户也能有一个会话篮子。FlatpageFallbackMiddleware用于兜底处理 flatpages。对照 sandbox/settings.py 第 153–171 行Sandbox 将FlatpageFallbackMiddleware与BasketMiddleware分别置于会话、认证等标准中间件之后其中注释明确写着Ensure a valid basket is added to the request instance for every request。3.5 配置认证后端支持邮箱登录为了让顾客用邮箱而不是用户名登录设置AUTHENTICATION_BACKENDS ( oscar.apps.customer.auth_backends.EmailBackend, django.contrib.auth.backends.ModelBackend, )仓库实现位于 src/oscar/apps/customer/auth_backends.pyEmailBackend继承 Django 的ModelBackend通过email__iexact做大小写不敏感的邮箱匹配并故意允许同一邮箱对应多个用户前提是密码不同只有恰好匹配到一个用户时才认证成功若多个用户共享同一邮箱与密码则抛出MultipleObjectsReturned拒绝认证。它还会在导入时校验 User 模型必须包含blankFalse的 email 字段否则抛出ImproperlyConfigured。3.6 配置媒体与静态文件Oscar 要求MEDIA_URL和STATIC_URL至少被正确设置如果本地提供文件还需要MEDIA_ROOT与STATIC_ROOT。可直接参考 Sandbox 的写法sandbox/settings.py 第 87–104 行MEDIA_ROOT location(public/media) MEDIA_URL /media/ STATIC_URL /static/ STATIC_ROOT location(public/static) STATICFILES_DIRS (location(static/),)远程存储如 Amazon S3时有一个容易踩的坑必须手动把 Oscar 的图片缺失占位图image_not_found.jpg见 src/oscar/defaults.py 第 30–32 行的OSCAR_MISSING_IMAGE_URL注释说明复制到MEDIA_ROOT否则 Sorl 无法生成占位缩略图。四、配置搜索后端HaystackOscar 通过 django-haystack 抽象不同搜索后端。如果暂时只需要基础搜索可以直接启用 Haystack 的简单后端HAYSTACK_CONNECTIONS { default: { ENGINE: haystack.backends.simple_backend.SimpleEngine, }, }需要说明的是编写与后端无关的搜索代码很困难目前 Apache Solr 是 Oscar 唯一官方支持的生产级后端。生产环境的 Haystack 配置大致如下HAYSTACK_CONNECTIONS { default: { ENGINE: haystack.backends.solr_backend.SolrEngine, URL: http://127.0.0.1:8983/solr, INCLUDE_SPELLING: True, }, }Oscar 仓库自带一份 Solr 起步用的示例 schema完整的搭建流程见 docs/source/howto/how_to_setup_solr.rst。Sandbox 默认使用 Whoosh 作为本地开发后端sandbox/settings.py 第 345–361 行并在注释中给出了 Solr 6.x 的推荐配置样例包含ADMIN_URL字段它还设置了HAYSTACK_SIGNAL_PROCESSOR haystack.signals.RealtimeSignalProcessor与 src/oscar/defaults.py 末尾的默认值一致使商品索引随数据变更实时更新。五、配置数据库快速起步推荐使用 SQLite并开启ATOMIC_REQUESTS将每个请求绑定到事务DATABASES { default: { ENGINE: django.db.backends.sqlite3, NAME: db.sqlite3, USER: , PASSWORD: , HOST: , PORT: , ATOMIC_REQUESTS: True, } }官方明确建议使用ATOMIC_REQUESTS将事务与请求绑定这对订单、购物篮等涉及多表写操作的电商流程尤其重要。Sandbox 的数据库配置sandbox/settings.py 第 19–29 行也默认开启ATOMIC_REQUESTS并支持通过DATABASE_ENGINE等环境变量切换后端。六、配置 URL修改frobshop/frobshop/urls.py挂载 Oscar 的 URLfrom django.apps import apps from django.urls import include, path from django.contrib import admin urlpatterns [ path(i18n/, include(django.conf.urls.i18n)), # The Django admin is not officially supported; expect breakage. # Nonetheless, its often useful for debugging. path(admin/, admin.site.urls), path(, include(apps.get_app_config(oscar).urls[0])), ]要点若你的LANGUAGES配置了多种语言必须包含i18n/路由。Sandbox 的做法更进一步它把 Oscar 路由放入i18n_patterns()让站点 URL 带语言前缀sandbox/urls.py 第 31–34 行。Django admin 不受官方支持Oscar 不保证 admin 可用仅作为开发者调试的便利存在生产环境应使用 Oscar 自带的 dashboard。七、创建数据库并启动Oscar 自带全部迁移文件Django 的迁移框架会自动检测并执行。执行$ python manage.py migrate $ python manage.py runserver此时你会得到一个空白但可运行的 Oscar 站点访问 http://localhost:8000 即可浏览。八、初始化国家数据Oscar 默认结算流程要求收货地址带有国家。Oscar 使用带标志位的 Country 模型is_shipping_country字段决定是否为可配送国家因此country表必须先填充否则顾客无法结算。最简单的方式是使用pycountry包的数据配合 Oscar 自带的填充命令$ pip install pycountry [...] $ python manage.py oscar_populate_countries命令默认把所有国家都标记为配送国家加--no-shipping参数则不标记之后你需要手动将至少一个国家标记为配送国家。从源码看src/oscar/management/commands/oscar_populate_countries.py该命令还支持--initial-only若国家已填充则静默退出用于幂等初始化脚本若未安装pycountry会直接抛出CommandError提示安装若表中已有数据且未指定--initial-only会报错拒绝覆盖因为当前版本不支持更新已有国家填充时一次性bulk_create写入所有国家并把iso_3166_1_a2、iso_3166_1_a3、iso_3166_1_numeric、printable_name、name等字段一并写入。九、创建商品类别与履约伙伴每个 Oscar 部署都至少需要一个商品类别product class和一个履约伙伴fulfilment partner。它们不会被自动创建因为高度依赖你的业务形态。商品类别对应 src/oscar/apps/catalogue/abstract_models.py 中的AbstractProductClass履约伙伴对应 src/oscar/apps/partner/abstract_models.py 中的AbstractPartner。创建方式先创建 Django 超级用户python manage.py createsuperuser。用该账号的邮箱登录 Oscar dashboardhttp://127.0.0.1:8000/dashboard/。在 dashboard 中分别创建商品类别与履约伙伴实例。再次强调Django admin 不受支持可能可用也可能不可用仅存在于 Sandbox 中方便开发者管理商品目录应始终使用 Oscar dashboard。对于生产部署官方建议把商品类别做成数据迁移data migration而非 initial data以保证在不同环境下可重复、可控地演进。十、定义订单状态管道Order Pipeline10.1 管道是什么Oscar 的订单管理依赖订单状态管道它定义一张订单可以处于的所有状态以及每个状态下可以转移到的下一个状态。状态不仅在订单层面使用也会细化到订单行line层面从而支持部分发货等场景。每个店铺的订单流程都不尽相同因此 Oscar 把管道设计为纯配置——直接在settings.py中用三个设置项描述OSCAR_INITIAL_ORDER_STATUS订单的初始状态OSCAR_INITIAL_LINE_STATUS订单行的初始状态OSCAR_ORDER_STATUS_PIPELINE状态转移字典。官方给出的示例与 Sandbox 一致见 sandbox/settings.py 第 390–399 行OSCAR_INITIAL_ORDER_STATUS Pending OSCAR_INITIAL_LINE_STATUS Pending OSCAR_ORDER_STATUS_PIPELINE { Pending: (Being processed, Cancelled,), Being processed: (Processed, Cancelled,), Cancelled: (), }10.2 语义与源码实现管道就是一个字典键是状态名值是该状态下允许转移到的状态的可迭代对象空的可迭代对象表示这是管道的终点。配置好这三个设置后订单管理 dashboard 就能展示不同的状态。从源码看src/oscar/apps/order/abstract_models.py 第 119–149 行pipeline类属性直接读取OSCAR_ORDER_STATUS_PIPELINE默认空字典all_statuses()返回所有可能状态即字典的所有键available_statuses()返回当前订单可以转移到的状态列表set_status()执行状态切换若目标状态不在允许列表则抛出InvalidOrderStatus。此外 Oscar 还支持一个进阶设置OSCAR_ORDER_STATUS_CASCADE当订单进入某个状态时自动把订单行级联设置为对应状态。Sandbox 的示例sandbox/settings.py 第 403–407 行OSCAR_ORDER_STATUS_CASCADE { Being processed: Being processed, Cancelled: Cancelled, Complete: Shipped, }注意 Sandbox 的完整管道比文档示例多了Complete: ()终点并在Being processed下允许转移到Complete这正体现了管道配置完全由业务决定的灵活性。如果默认的set_status逻辑不够用例如需要更复杂的校验官方建议覆写 Order 对象上的set_status方法。十一、下一步实现你的业务逻辑到这里一个可浏览、可结算完成国家数据填充后、带搜索与订单状态管理的 Oscar 站点已经成型。接下来就是整个过程中最有意思的部分在 Oscar 之上实现你所在领域的业务逻辑。可以继续深入的方向包括定制模型与视图参考 docs/source/topics/customisation.rst 与 docs/source/howto/how_to_customise_models.rst对接支付参考 docs/source/howto/how_to_integrate_payment.rst配置运费参考 docs/source/howto/how_to_configure_shipping.rst升级与部署参考 docs/source/topics/upgrading.rst 与 docs/source/topics/deploying.rst。附快速自查清单配置项要求from oscar.defaults import *导入全部 Oscar 默认设置context_processors追加 search_form、checkout、notifications、metadata 四个处理器INSTALLED_APPS包含django.contrib.sites、flatpages、oscar.config.Shop、全部 Oscar 应用及 widget_tweaks/haystack/treebeard/sorl.thumbnail/django_tables2SITE_ID必须设置如1MIDDLEWARE追加BasketMiddleware、FlatpageFallbackMiddlewareAUTHENTICATION_BACKENDS追加EmailBackend以支持邮箱登录MEDIA_URL/STATIC_URL至少设置这两项本地服务需MEDIA_ROOT/STATIC_ROOT远程存储需复制占位图HAYSTACK_CONNECTIONS简单后端或 Solr 后端任选其一DATABASES推荐 SQLite ATOMIC_REQUESTS: True国家数据pip install pycountry后执行oscar_populate_countries订单管道设置OSCAR_INITIAL_ORDER_STATUS、OSCAR_INITIAL_LINE_STATUS、OSCAR_ORDER_STATUS_PIPELINE按照上述步骤逐一配置你就拥有了一套完全属于自己、可继续深入定制的 Oscar 商城骨架。赞分享后端电商【免费下载链接】django-oscarDomain-driven e-commerce for Django项目地址https://gitcode.com/gh_mirrors/dj/django-oscar点击查看免费下载相关推荐终极Rime输入法方案集面向中文用户的完整指南终极Rime输入法方案集面向中文用户的完整指南 Rime输入法是一个高度可定制化的开源输入法框架支持多种输入方案。本项目是一个专门为Rime输入法用户打造的知识库文档Getting Started {getting-started}Getting Started { getting started} Configuring Models { configuring models} 适用场景开发工具代码编辑器桌面应用从零构建完整微信小程序商城海风小店开源项目实战指南从零构建完整微信小程序商城海风小店开源项目实战指南 海风小店hioshop miniprogram是一个功能完备的开源微信小程序商城解决方案专为电商创业前端小程序电商上一篇如何用 Avogadro 2 快速上手免费分子建模新手完整指南下一篇大麦自动抢票三步搭好自己的抢票脚本完整新手教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表