Python电商系统从零搭建教程:前后端分离+支付集成+源码分享

Python电商系统从零搭建教程:前后端分离+支付集成+源码分享 一

文章目录CloseOpen

你是不是试过跟着教程搭项目,结果第一步环境配置就卡壳?不是缺依赖就是版本冲突,最后不了了之?我去年帮一个朋友搭服装电商网站时,就踩过这个坑——他用Flask搭了两周,光用户登录模块就写了300多行代码,还没联数据库就崩了。后来我 他换Django,结果20天就跑通了从商品展示到下单支付的全流程。今天我把这套“避坑指南”整理出来,你跟着做,保准少走弯路。

框架与工具选型:别让“选择困难症”耽误开发

选技术栈就像挑食材,不是越贵越好,得看你要做什么菜。电商系统需要用户管理、商品上架、订单支付这些“标准动作”,我对比了三种主流Python框架,最后选了Django,你可以参考这个表格:

框架 优势 劣势 适合场景
Django 自带admin后台、auth认证,生态完善 略重,定制化复杂功能需“拆轮子” 中小电商、快速上线项目
Flask 轻量灵活,适合定制化开发 需手动集成ORM、权限等组件 特殊业务场景(如跨境电商)
FastAPI 异步性能强,自动生成接口文档 生态较新,第三方库支持少 高并发需求(如秒杀系统)

为什么选Django?

电商最需要“开箱即用”的功能,比如后台管理商品、订单,Django的admin后台直接帮你生成CRUD界面,连搜索和筛选都自带。我朋友那个服装网站,商品有颜色、尺码、库存多个属性,用Django的ModelForm做表单验证,三行代码就实现了“库存不足时禁止下单”的逻辑,要是用Flask,至少得手写20行验证规则。

数据库选MySQL还是MongoDB?必须MySQL(或PostgreSQL)。电商订单涉及支付、库存变更,需要事务支持——比如用户下单时要扣库存+生成订单,这两步得同时成功或同时失败,MongoDB的事务功能到4.0才支持,不如MySQL成熟。我之前见过有人用MongoDB存订单,结果并发下单时出现“超卖”,最后还是换回MySQL加行锁解决的。

前端不用太复杂,Vue.js+Element UI就行,前后端分离的好处是改界面不影响后端。你可以先写好后端API,用Postman测通,再让前端同学对接,这样分工清晰,不容易吵架(别问我怎么知道的)。

环境配置“懒人指南”

环境配置最烦的是版本冲突,比如Python 3.11装Django 2.2会报错,MySQL 8.0的密码加密方式和旧驱动不兼容。分享我 的“稳定组合”:

  • Python:3.8~3.10(别用最新版,有些库还没适配)
  • Django:4.2 LTS(长期支持版,bug少)
  • MySQL:8.0(记得装mysqlclient驱动时加mysql-config=/usr/local/mysql/bin/mysql_config,不然会报“mysql.h not found”)
  • 虚拟环境:用venv(Python自带,不用额外装)
  • 具体步骤

    (以Mac为例,Windows把命令里的“source”换成“venvScriptsactivate”):

  • 建文件夹:mkdir python-ecommerce && cd python-ecommerce
  • 创虚拟环境:python -m venv venv
  • 激活环境:source venv/bin/activate(激活后终端会显示(venv),说明进入独立环境)
  • 装依赖:pip install django==4.2 djangorestframework mysqlclient django-cors-headers
  • django-cors-headers是解决跨域问题的,前后端分离必装
  • 建项目:django-admin startproject ecommerce .(注意末尾的“.”,不然会多套一层文件夹)
  • 改配置:打开settings.py,把数据库配置改成MySQL:
  • DATABASES = {
    

    'default': {

    'ENGINE': 'django.db.backends.mysql',

    'NAME': 'ecommerce', # 数据库名(提前用MySQL命令行建好)

    'USER': 'root',

    'PASSWORD': '你的密码',

    'HOST': 'localhost',

    'PORT': '3306',

    'OPTIONS': {'charset': 'utf8mb4'}, # 支持emoji表情

    }

    }

  • 启动服务:python manage.py runserver,访问http://127.0.0.1:8000/,看到Django小火箭就成功了!
  • 避坑提醒

    :如果启动时报“django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module”,说明mysqlclient没装好,Mac用户可以先装依赖:brew install mysql-client,再重新pip install mysqlclient。Windows用户直接下预编译的.whl文件(去Unofficial Windows Binaries找对应版本),比自己编译快10倍。

    核心功能开发与实战技巧

    环境搭好就开始写功能,后端开发要抓住“用户-商品-订单-支付”这条主线。我按开发顺序拆成三个模块,每个模块都有“新手容易踩的坑”和“偷懒小技巧”。

    用户认证:别重复造轮子

    用户登录、注册、权限管理,直接用Django REST framework的Token认证,别自己写JWT(除非你需要刷新令牌功能)。DRF的Token认证三行代码就能实现:

  • 装drf后,在settings.py加:INSTALLED_APPS = [..., 'rest_framework.authtoken']
  • 生成令牌表:python manage.py migrate
  • 写登录视图:
  • from rest_framework.authtoken.views import ObtainAuthToken
    

    urlpatterns = [path('api/login/', ObtainAuthToken.as_view())]

    测试时用Postman发POST请求,传{"username": "test", "password": "123456"},就会返回token,前端存到localStorage里,下次请求在Header加Authorization: Token 你的token就行。

    扩展用户模型

    :Django自带的User模型只有用户名、密码,电商需要手机号、收货地址,这时候用AbstractUser继承扩展,千万别直接改User源码!我之前手贱改过,后来升级Django版本,数据库迁移直接报错,最后只能手动改迁移文件(血泪教训)。

    # apps/users/models.py
    

    from django.contrib.auth.models import AbstractUser

    class User(AbstractUser):

    phone = models.CharField(max_length=11, unique=True)

    avatar = models.ImageField(upload_to='avatars/', null=True)

    # 记得在settings.py加:AUTH_USER_MODEL = 'users.User'

    商品与订单:核心业务逻辑

    商品模块重点是模型设计,以服装为例:

    class Category(models.Model): # 商品分类(如“上衣”“裤子”)
    

    name = models.CharField(max_length=50)

    parent = models.ForeignKey('self', null=True, blank=True, on_delete=models.CASCADE) # 支持二级分类

    class Product(models.Model): # 商品主表

    name = models.CharField(max_length=200)

    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    price = models.DecimalField(max_digits=10, decimal_places=2)

    stock = models.IntegerField(default=0) # 总库存

    class ProductSKU(models.Model): # 商品SKU(如“红色-XL”)

    product = models.ForeignKey(Product, related_name='skus', on_delete=models.CASCADE)

    color = models.CharField(max_length=20)

    size = models.CharField(max_length=10)

    sku_stock = models.IntegerField(default=0) # SKU级库存

    sku_code = models.CharField(max_length=50, unique=True) # 唯一编码,用于库存管理

    为什么要拆SKU表?

    比如一件T恤有3种颜色、4种尺码,总库存100件,但可能“黑色-L”只剩5件,这时候必须按SKU管理库存,不然用户下单时选“黑色-L”会提示“库存不足”,但系统显示总库存100件,用户会以为你骗他。

    订单模块要注意状态流转,从“待支付”→“已支付”→“已发货”→“已完成”,用Django的choices字段定义:

    class Order(models.Model):
    

    STATUS_CHOICES = (

    ('pending', '待支付'),

    ('paid', '已支付'),

    ('shipped', '已发货'),

    ('completed', '已完成'),

    ('cancelled', '已取消'),

    )

    order_sn = models.CharField(max_length=32, unique=True) # 订单号(用uuid生成,别用自增ID)

    user = models.ForeignKey(User, on_delete=models.CASCADE)

    total_amount = models.DecimalField(max_digits=10, decimal_places=2)

    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')

    created_at = models.DateTimeField(auto_now_add=True)

    订单号别用自增ID

    !比如用户看到订单号是10086,就知道你才接了1万单,用uuid更安全(import uuid; order_sn = uuid.uuid4().hex[:16]生成16位字符串)。

    支付集成:从申请到上线

    支付集成是电商的“最后一公里”,中小商家 先接支付宝(文档比微信清晰,审核快3天)。步骤如下:

  • 支付宝开放平台注册开发者账号,创建“自研应用”,选“电商平台”类目
  • 下载Python SDK:pip install pycryptodome alipay-sdk-python
  • 配置公钥私钥:用支付宝提供的“密钥生成工具”生成RSA2密钥,公钥上传到开放平台,私钥存在项目的config文件夹(别提交到Git!)
  • 写支付接口:
  • from alipay import AliPay
    

    alipay = AliPay(

    appid="你的APPID",

    app_notify_url="https://你的域名/api/pay/callback/", # 支付结果回调地址(必须https)

    app_private_key_string=open("config/private_key.pem").read(),

    alipay_public_key_string=open("config/public_key.pem").read(),

    sign_type="RSA2"

    )

    def pay(request):

    order = Order.objects.get(order_sn=request.data['order_sn'])

    order_string = alipay.api_alipay_trade_page_pay(

    out_trade_no=order.order_sn,

    total_amount=float(order.total_amount),

    subject=order.product.name,

    return_url="https://你的域名/pay/success", # 支付成功后跳转页面

    notify_url="https://你的域名/api/pay/callback/" # 异步回调地址

    )

    pay_url = "https://openapi.alipay.com/gateway.do?" + order_string

    return Response({'pay_url': pay_url})

    关键坑点

  • 回调地址必须是https(本地开发可以用ngrok内网穿透,生成临时https域名)
  • 一定要验证回调签名!alipay.verify(data, signature)返回True才处理订单状态,不然会被伪造请求(我朋友网站上线第一天就被人发了10条伪造的支付成功回调,还好验签没通过)
  • 订单状态更新用乐观锁Order.objects.filter(order_sn=order_sn, status='pending').update(status='paid'),防止重复处理回调
  • 如果你按这些步骤搭项目,遇到“签名错误”,先检查公钥是不是上传对了——公钥开头是“BEGIN PUBLIC KEY”,别漏了换行符。要是卡在环境配置,留言告诉我你的系统和报错信息,我帮你看看!


    作为新手刚开始捣鼓电商系统,最头疼的肯定是那些“重复性体力活”——比如用户登录注册要写表单验证、密码加密,商品管理得自己做增删改查界面,订单流程还得处理权限控制。这时候Django简直是“救星”,它把这些基础功能全打包好了,你不用从零敲代码。就说那个admin后台吧,你定义好商品模型(比如名称、价格、库存这些字段),Django自动给你生成带搜索、筛选、批量操作的管理界面,上架商品时填个表单点保存就行,连库存预警这种小功能都能在admin里直接配置,根本不用自己写前端页面和后端逻辑。

    我之前带过一个刚学Python的朋友开发小零食电商,他一开始想用Flask,结果光用户登录模块就卡了一周——又是装Flask-Login处理登录状态,又是用WTForms写表单验证,还得自己设计数据库表结构。后来换成Django,用自带的User模型扩展手机号字段,加个ModelForm做用户注册表单,3天就把用户系统跑通了。反观Flask,虽然灵活,但所有组件都得自己拼,比如要做权限管理得装Flask-Principal,处理数据库得用SQLAlchemy,新手很容易在“集成组件”这一步就被劝退。当然啦,如果你的电商需求特别复杂,比如要做多层级的会员积分系统,或者和第三方系统深度对接,那Flask的灵活性会更合适,但对刚开始上手的新手来说,先拿Django把核心功能跑起来,看到实实在在的效果,比纠结技术选型更重要。


    Django和Flask哪个更适合新手开发电商系统?

    对新手来说优先选Django。Django自带admin后台(直接管理商品、订单)、用户认证(登录注册无需从零写)和ORM(不用手写SQL),这些“开箱即用”的功能能帮你节省80%重复开发时间。比如商品上架功能,Django用ModelForm+admin配置,10分钟就能实现“添加商品+库存管理”,而Flask需要手动集成表单验证、权限控制等组件,对新手不够友好。如果你的电商需求简单(如单品类商品、用户量不大),Django完全够用;如果需要高度定制化(如特殊的会员积分系统),再考虑Flask。

    本地开发时支付回调必须用HTTPS,没有域名怎么办?

    可以用内网穿透工具生成临时HTTPS域名,推荐ngrok(免费版够用)。步骤很简单:去ngrok官网下载客户端,注册后获取授权令牌,在终端运行ngrok http 8000(8000是Django开发服务器端口),会生成类似https://abc123.ngrok.io的域名,把这个域名填到支付宝开放平台的“回调地址”里,就能接收支付回调了。注意免费版域名会随机变化,每次重启ngrok后需要在开放平台更新回调地址。

    开发时遇到“ModuleNotFoundError: No module named ‘mysqlclient’”怎么解决?

    这是mysqlclient驱动没装好,不同系统解决方式不同:

  • Windows:去Unofficial Windows Binaries下载对应Python版本的.whl文件(如Python 3.9选mysqlclient‑2.2.0‑cp39‑cp39‑win_amd64.whl),然后用pip install 文件名.whl安装。
  • Mac:先装依赖brew install mysql-client,再运行pip install mysqlclient global-option=build_ext global-option="-I/usr/local/opt/mysql-client/include" global-option="-L/usr/local/opt/mysql-client/lib"
  • Linux:sudo apt-get install libmysqlclient-dev(Ubuntu)或sudo yum install mysql-devel(CentOS),然后再pip install mysqlclient
  • 文章提到的完整源码如何获取?

    源码会放在GitHub仓库,你可以在文章末尾(或评论区置顶)找到仓库链接,直接git clone下载。仓库里包含完整的项目结构、数据库迁移文件和测试数据,下载后按README里的“环境配置步骤”操作,5分钟就能跑起来。如果没找到链接,可以在评论区留言“求源码”,我会把链接发给你。

    开发完成的电商系统,推荐用什么方式部署上线?

    中小规模电商推荐“轻量服务器+Gunicorn+Nginx”组合,成本低且够用:

  • 服务器:阿里云/腾讯云的轻量应用服务器(2核4G内存,约50元/月),选“Docker镜像”系统,方便管理环境。
  • 部署步骤:先把代码传到服务器(用Git或SFTP),安装依赖后用gunicorn ecommerce.wsgi:application bind 0.0.0.0:8000启动应用,再用Nginx做反向代理(处理静态文件、SSL证书)。
  • 数据库:用服务器自带的MySQL,或直接用云数据库RDS(更稳定,适合数据量大的场景)。如果担心操作复杂,也可以用Docker Compose一键部署(仓库里有现成的docker-compose.yml文件)。
  • 0
    显示验证码
    没有账号?注册  忘记密码?