saleor 是一个快速发展的开源电子商务平台,基于 python 和 django开发,且持续更新中,一点不用担心版本过旧的问题。
它的特点如下:
graphql api :基于graphql实现的前后端分离,属于最前沿的技术。仪表板 :管理员可以完全控制用户、流程和产品。订单 :订单、发货和退款的综合系统。购物车 :高级付款和税收选项,支持折扣和促销活动支付 :灵活的 api 架构允许集成任何支付方式。地理自适应 :自动支持多国家的结账体验。支持云部署 :支持docker部署。支持谷歌分析 :集成了谷歌分析,可以很方便地分析流量去留。saleor 仓库地址:
https://github.com/mirumee/saleor
1.部署指南
saleor支持多种运行方式,你可以采用手动安装并运行的方式,也可以使用docker进行运行,下面介绍全平台通用且最简单的docker部署方案。
在按照以下说明操作之前,你需要安装docker desktop和docker compose,如果你没安装过,可以看看这篇教程:
https://www.runoob.com/docker/docker-tutorial.html
docker 部署 saleor 非常方便,你只需要克隆存储库并构建镜像然后运行服务即可:
# python 实用宝典# 克隆存储库git clone https://github.com/mirumee/saleor-platform.git --recursive --jobs 3cd saleor-platform# 构建docker镜像docker-compose build如果你无法成功克隆 salor 源代码仓库,请在python实用宝典公众号回复:**saleor **下载全部源代码。
saleor 使用共享文件夹来启用 实时代码重新加载 。如果你使用的是windows或 macos ,则需要:
1.将克隆的 saleor-platform 目录放置到 docker 的共享目录配置 (settings -> shared drives or preferences -> resources -> file sharing )。
2.确保在 docker 首选项中你有至少 5 gb 的专用内存(设置 -> 高级 或 *首选项 * ->资源 -> 高级 )
执行数据库migrations及打包前端资源:
docker-compose run --rm api python3 manage.py migratedocker-compose run --rm api python3 manage.py collectstatic --noinput(可选)使用示例数据填充数据库:
docker-compose run --rm api python3 manage.py populatedb最后,为自己创建一个管理员帐户:
docker-compose run --rm api python3 manage.py createsuperuser**
运行服务:**
使用以下命令运行saleor:
docker-compose up
2.架构介绍
如果你要基于 saleor 进行开发,那么你必须了解它的架构。
saleor 由三个重要组件组成:
1.saleor core, 它是graphql api的后端服务器。基于django开发,数据库采用了postgresql并在redis中储存了一些缓存信息。
2.saleor dashboard , 这是一个可以用来经营商店的仪表盘,它是一个静态网站,因此没有任何自己的后端代码,它是一个与saleor core核心服务器对话的react程序。
3.saleor storefront, 这是基于react实现的示例商店,你可以自定义这部分代码满足你自己的需求,也可以使用 saleor sdk 构建自定义店面。
所有三个组件都使用 graphql 通过 https 进行通信。
3.扩展开发
虽然你可以直接基于saleor源代码进行开发,但是官方建议不这么做,原因是一旦你的代码和saleor官方源代码产生冲突,你就很难跟上官方的更新,最终会导致代码没人维护的尴尬局面。
因此saleor提供了两种添加功能的方式:
1.插件功能 :插件提供了一种在 saleor core 上运行附加代码的能力,而且有访问数据库的能力。
2.apps :基于 graphql api 和 saleor core 开发app,还可以使用 webhooks 订阅事件。
下面我们介绍如何基于插件进行扩展开发。
如上图所示,saleor core 提供了一种回调通知事件给插件,插件基于此事件进行相关操作,并与数据库进行交互。
开发插件, 你必须继承 baseplugin 基类,然后重写部分方法,比如下面这个例子重写了** postprocess_order_creation **方法,增加了订单创建时的一些操作:
# python实用宝典# custom/plugin.pyfrom django.conf import settingsfrom urllib.parse import urljoinfrom ..base_plugin import basepluginfrom .tasks import api_post_request_taskclass customplugin(baseplugin): def postprocess_order_creation(self, order: order, previous_value: any): # 订单创建时的操作 data = ... transaction_url = urljoin(settings.custom_api_url, transactions/createoradjust) api_post_request_task.delay(transaction_url, data)**加载插件, 需要在 setup.py 进行配置来自动发现已安装的插件。要使插件可被发现,你需要设置entry_points的saleor_plugins **字段, 并使用这个语法定义插件: ** package_name = package_name.path.to:pluginclass ** .
示例如下:
# setup.pyfrom setuptools import setupsetup( ..., entry_points={ saleor.plugins: [ my_plugin = my_plugin.plugin:myplugin ] })如果你的插件是 django 应用程序,包名(等号前的部分)将被添加到 django 的**installed_apps **中,以便你可以利用 django 的功能,例如 orm 集成和数据库迁移。
注意到我们前面订单创建时的操作使用了 .delay 的语法,这是 celery 的异步任务。因为有些插件的操作就应该异步完成,saleor 使用 celery 并将发现 tasks.py 在插件目录中声明的所有异步任务:
# custom_plugin/tasks.pyimport jsonfrom celery import shared_taskfrom typing import any, dictimport requestsfrom requests.auth import httpbasicauthfrom django.conf import settings@shared_taskdef api_post_request( url: str, data: dict[str, any],): try: username = username password = password auth = httpbasicauth(username, password) requests.post(url, auth=auth, data=json.dumps(data), timeout=settings.timeout) except requests.exceptions.requestexception: return上面这个**api_post_request **函数就是前面插件用到的异步任务,在插件调用delay方法后,这个任务将被塞到队列中异步执行。
好了,上面就是一个简单的插件开发例子,个人认为 saleor 的开发模式还是很不错的。
基于一个晶体管构建的FM接收器
为什么高速信号ESD设置要flow-through
关于稳压电源自动测试系统的设计
新功能发布 | TSMaster重大更新,一文了解信号映射操作流程
诺基亚,下;华为,上!
如何部署开源Python超漂亮电子商城
电池寿命—不要忽视IC的典型规格
百度和阿里在带屏智能音箱领域有何胜算
泰克AWG5014C开机不显示案例-波形发生器维修
图像插值理论研究之双三次插值
STP20M100S肖特基二极管封装设计介绍
用于连接控制设备和现场设备回路供电的总线
模拟电路推荐学习书单
国民技术国标之劫:偏执狂的新故事
苹果成MEMS领域创收大户,IMU商机无限
高速转换器的原理是什么,它的作用有哪些
WT2605车载音频蓝牙芯片的方案推荐
负荷传感器是什么?它常见的类型有哪些
手机锂电池保护板有什么作用
机器人码垛机保养及维修的注意事项 帕斯科山东机器人科技有限公司