
后端电商【免费下载链接】django-oscarDomain-driven e-commerce for Django项目地址https://gitcode.com/gh_mirrors/dj/django-oscar点击查看免费下载这是一篇针对 Django Oscar 0.7.1 版本发布说明的技术解读文章。Oscar 0.7.1 是一个仅包含单点修复的小版本其核心改动落在 checkout结账模块的会话混入session mixin上允许PaymentDetails视图类的子类在结账预览preview阶段显式指定要提交的购物篮basket而不是强制使用与当前请求绑定的request.basket。读完本文你将理解 Oscar 结账流程中购物篮的冻结—提交—恢复机制、build_submission对购物篮的解析顺序以及第三方支付网关如 PayPal集成时为何必须覆盖默认购物篮并能据此在自己的项目中对结账视图进行正确的子类化与定制。版本背景0.7 的 checkout 重构是 0.7.1 修复的前提Oscar 0.7发布于 2014-04-29见 v0.7 发布说明是一次以维护为主的版本但其间对 checkout 核心视图类做了显著重组这直接决定了 0.7.1 修复的形态每个结账视图类新增pre_conditions属性它是一个由方法名字符串组成的可迭代对象在视图dispatch阶段逐个执行检查失败时会把顾客重定向到链路上更早的视图同时引入skip_conditions用于在条件满足时跳过当前视图、跳转到链路中更晚的视图PaymentDetailsView被拆分为细粒度方法以便扩展包括handle_payment_details_submission校验支付表单、handle_place_order_submission从 preview 页提交下单和render_payment_details等旧的get_error_response、can_basket_be_submitted两个方法被移除submit对支付异常的处理也改为把原始表单回传模板以便显示表单校验错误。正是这套重构引入了更灵活的提交管线才使得 0.7.1 可以在不推翻整体结构的前提下为显式指定购物篮打开一个正式的入口。从 checkout 视图源码 可以看到PaymentDetailsView继承自OrderPlacementMixin与generic.TemplateView同一类视图被payment-details与preview两个 URL 复用通过preview布尔属性区分所处阶段。0.7.1 修复了什么允许 checkout 会话显式指定购物篮v0.7.1 发布说明 原文将这次改动表述为对 checkout 会话混入checkout session mixin做了一处修改使得 checkout 的PaymentDetails视图类的子类可以显式指定一个购物篮当预览阶段意图使用与request.basket不同的购物篮时这是必需的——而django-oscar-paypal正是这种需求的实际案例。换句话说在默认结账流程里系统假定当前请求会话中的购物篮就是将要下单的购物篮但对于 PayPal 这类重定向式第三方支付订单提交往往发生在另一个请求上顾客被重定向到 PayPal 再跳回此时原始的request.basket可能已经变化甚至被冻结结账系统必须能够从会话中恢复并使用预先提交的那个购物篮。源码级原理购物篮是如何被解析与覆盖的虽然当前仓库已演进到 4.x 分支但显式指定购物篮这一机制被完整保留了下来可以从源码中逐层验证 0.7.1 修复的实际效果。1.build_submissionbasket 优先取显式传入值在 checkout/session.py 的CheckoutSessionMixin.build_submission中第一行就是购物篮的解析逻辑# Pop the basket if there is one, because we pass it as a positional # argument to methods below basket kwargs.pop(basket, self.request.basket)这行代码正是 0.7.1 修复精神在当代代码中的直接体现如果调用方通过kwargs显式传入basket则优先使用该购物篮否则回退到self.request.basket。随后shipping_address、shipping_method、billing_address、order_total等全部基于这个解析出的basket计算最终组成提交字典submission { user: self.request.user, basket: basket, shipping_address: shipping_address, shipping_method: shipping_method, billing_address: billing_address, order_kwargs: {}, payment_kwargs: {}, }2.submit购物篮以参数贯穿下单全程PaymentDetailsView.submit的签名将basket作为显式参数接收见 views.py并在下单流程中使用它def submit(self, user, basket, shipping_address, shipping_method, shipping_charge, billing_address, order_total, payment_kwargsNone, order_kwargsNone, surchargesNone):submit内部依次执行生成订单号 →freeze_basket(basket)冻结购物篮防止顾客在第三方站点付款期间被篡改→ 将购物篮 ID 写入会话checkout_session.set_submitted_basket(basket)→ 触发支付 → 成功后调用handle_order_placement落单。3.handle_order_placement为什么必须显式传 basket在 checkout/mixins.py 中handle_order_placement的 docstring 给出了设计动机We deliberately pass the basket in here as the one tied to the request isnt necessarily the correct one to use in placing the order. This can happen when a basket gets frozen.即与请求绑定的购物篮不一定是下单应使用的购物篮——典型场景就是购物篮被冻结如 PayPal 重定向支付期间。因此OrderPlacementMixin的所有下单方法都要求把购物篮作为参数显式传入而非隐式读取request.basket。4. 冻结与恢复多请求支付流程的配套机制OrderPlacementMixin还提供了一组配套方法mixins.pyfreeze_basket(basket)冻结购物篮并将会话中保存其 ID供多阶段结账取用get_submitted_basket()从会话读取已提交购物篮的 ID 并取回模型实例restore_frozen_basket()解冻已提交购物篮若期间顾客又新建了购物篮例如支付失败后再次加购则自动合并并把策略strategy同步为当前请求的购物篮策略。这解释了为何 0.7.1 对django-oscar-paypal是必需修复PayPal 支付需要在一个预览请求上使用会话中已提交的购物篮来展示订单确认页而在此之前混入层只会读取request.basket导致展示内容与实际下单内容不一致。实战在自己的项目中显式指定购物篮基于上述机制在项目里覆盖默认购物篮的标准做法是子类化PaymentDetailsView并在build_submission或handle_payment_details_submission中传入目标购物篮from oscar.apps.checkout import views class MyPaymentDetailsView(views.PaymentDetailsView): def build_submission(self, **kwargs): # 从会话中恢复预先提交的购物篮而不是使用 request.basket kwargs[basket] self.get_submitted_basket() return super().build_submission(**kwargs)要点如下build_submission是所有结账视图组装模板上下文的统一入口session.py 的get_context_data会调用它在此覆盖basket即可让预览页、支付与下单全部使用目标购物篮若你的支付流程需要支付失败后恢复购物篮可复用restore_frozen_basket()它会把冻结购物篮解冻并与新加购内容合并若自定义视图需要额外的前置校验可在pre_conditions列表中加入自己的方法名并在视图类中实现对应方法失败时抛出FailedPreCondition以重定向回正确环节。仓库中对应的会话层测试位于 tests/integration/checkout/test_session.py覆盖了CheckoutSessionData的数据写入/读取、命名空间刷新、访客邮箱存储等行为混入层测试位于 tests/integration/checkout/test_mixins.py其中test_check_basket_is_valid_no_stock_available与test_check_basket_is_valid_stock_exceeded验证了购物篮有效性的前置条件检查——这也是购物篮必须可提交这一约束在测试层的体现。结语Oscar 0.7.1 虽然只有一处修复但它补全了 0.7 结账重构留下的关键拼图让结账会话混入支持显式指定购物篮从而使重定向式第三方支付以django-oscar-paypal为代表能够在预览阶段正确使用已提交的购物篮。理解build_submission的 basket 解析顺序、submit的参数化设计以及冻结/恢复机制是任何希望深度定制 Oscar 结账或集成外部支付网关的开发者绕不开的基础功课。说明本文以历史发布说明 v0.7.1.rst 为骨架并结合 v0.7.rst 的结账重构背景展开源码引用基于当前仓库的 views.py、mixins.py 与 session.py这些文件中保留的 basket 显式传入机制与 0.7.1 的修复目标一致。历史版本0.7.1的具体行为以当年发布包为准本文的代码示例适用于当前仓库的结账 API。赞分享后端电商【免费下载链接】django-oscarDomain-driven e-commerce for Django项目地址https://gitcode.com/gh_mirrors/dj/django-oscar点击查看免费下载相关推荐django-oscar 0.7.2 安全版本解析permissions_required 装饰器修复与购物篮视图 500 问题django oscar 0.7.2 安全版本解析permissions_required 装饰器修复与购物篮视图 500 问题 django oscar 0后端电商Django-Oscar扩展开发指南Django Oscar扩展开发指南 本文深入探讨了Django Oscar电子商务框架的四大核心扩展开发领域自定义支付网关集成、物流配送系统扩展、会员等级与后端电商Django-Oscar支付网关集成终极指南支持多种支付方式的完整解决方案Django Oscar支付网关集成终极指南支持多种支付方式的完整解决方案 Django Oscar作为基于Django的电子商务框架提供了灵活强大的支付网后端电商上一篇破解气象数据服务难题Open-Meteo平台的本地化部署与自主可控方案下一篇三步终极解决方案突破群晖硬盘兼容性限制让第三方硬盘完美运行创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考