社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

Crossin的编程教室 • 5 年前 • 847 次点击  


大家好,欢迎来到 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 使用共享文件夹来启用实时代码重新加载。如果你使用的是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 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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/117127