
你是不是试过跟着教程搭项目,结果第一步环境配置就卡壳?不是缺依赖就是版本冲突,最后不了了之?我去年帮一个朋友搭服装电商网站时,就踩过这个坑——他用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的密码加密方式和旧驱动不兼容。分享我 的“稳定组合”:
具体步骤
(以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-admin startproject ecommerce .
(注意末尾的“.”,不然会多套一层文件夹) 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认证三行代码就能实现:
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天)。步骤如下:
pip install pycryptodome alipay-sdk-python
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})
关键坑点
:
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驱动没装好,不同系统解决方式不同:
pip install 文件名.whl
安装。 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"
。 sudo apt-get install libmysqlclient-dev
(Ubuntu)或sudo yum install mysql-devel
(CentOS),然后再pip install mysqlclient
。 文章提到的完整源码如何获取?
源码会放在GitHub仓库,你可以在文章末尾(或评论区置顶)找到仓库链接,直接git clone
下载。仓库里包含完整的项目结构、数据库迁移文件和测试数据,下载后按README里的“环境配置步骤”操作,5分钟就能跑起来。如果没找到链接,可以在评论区留言“求源码”,我会把链接发给你。
开发完成的电商系统,推荐用什么方式部署上线?
中小规模电商推荐“轻量服务器+Gunicorn+Nginx”组合,成本低且够用:
gunicorn ecommerce.wsgi:application bind 0.0.0.0:8000
启动应用,再用Nginx做反向代理(处理静态文件、SSL证书)。