轻松部署一个Python版的网上商城

Crossin的编程教室

共 5157字,需浏览 11分钟

 ·

2021-07-19 02:21


大家好,欢迎来到 Crossin的编程教室 !
正文开始之前先通知一个福利:

当当暑假阅读季优惠码

今天可在每满100-50的基础上叠加

  满200减30:

VN4U6M

  满300减60:
VQJGZD

结算时选择【优惠码】

输入 VN4U6M 或 VQJGZD 即可

数量有限,先到先得

(详细使用教程参见今日推送的第3条)



之前有同学问我,想自己搭建一个电商网站,不知道python有没有类似的开源项目?
答案是肯定的,今天我们就给大家介绍这样的一个项目:Saleor
Saleor 是一个快速发展的开源电子商务平台,基于 Python 和 Django 开发。

它的特点如下:

1.GraphQL API:基于GraphQL实现的前后端分离,属于最前沿的技术。
2.仪表板:管理员可以完全控制用户、流程和产品。
3.订单:订单、发货和退款的综合系统。
4.购物车:高级付款和税收选项,支持折扣和促销活动
5.支付:灵活的 API 架构允许集成任何支付方式。
6.地理自适应:自动支持多国家的结账体验。
7.支持云部署:支持Docker部署。
8.支持谷歌分析:集成了谷歌分析,可以很方便地分析流量去留。

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 3
cd saleor-platform
# 构建Docker镜像
docker-compose build


如果你因为网络问题无法成功克隆 Saleor 源代码仓库,可以通过 gitee 间接下载,方法参加:曲线救国:提高github下载速度到2MB/s

Saleor 使用共享文件夹来启用实时代码重新加载。如果你使用的是WindowsMacOS,则需要:

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 migrate
docker-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.py

from django.conf import settings
from urllib.parse import urljoin

from ..base_plugin import BasePlugin
from .tasks import api_post_request_task


class 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.py
from setuptools import setup

setup(
    ...,
    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.py

import json
from celery import shared_task
from typing import Any, Dict

import requests
from requests.auth import HTTPBasicAuth
from django.conf import settings


@shared_task
def 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 的开发模式还是很不错的。如果大家有需要,可以采用这个项目构建一个属于自己的商城。

如果文章对你有帮助,欢迎转发/点赞/收藏~

作者:Ckend

来源:Python实用宝典


_往期文章推荐_

曲线救国:提高github下载速度到2MB/s




如需了解付费精品课程教学答疑服务
请在Crossin的编程教室内回复: 666

浏览 15
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报