1. 项目概述与选型思考
这个基于Python的网上购物商城系统项目,选择PyCharm作为开发IDE,并采用Django/Flask双框架方案,是一个典型的电商类全栈开发实践。我在实际开发中发现,这种技术组合既能发挥Python生态的高效开发优势,又能兼顾电商系统对稳定性和灵活性的双重需求。
Django作为"全功能型"框架,其自带的ORM、Admin后台和认证系统非常适合快速搭建商城基础架构。而Flask的轻量级特性则便于实现定制化的API接口和特殊业务逻辑。两者结合使用时,通常将用户中心、商品管理等标准化模块交给Django,而支付回调、第三方服务集成等需要灵活处理的环节用Flask实现。
提示:初学者常纠结于Django和Flask的二选一,但在实际商业项目中,根据模块特性混合使用两者反而能发挥各自优势。关键是要明确各框架的职责边界。
2. 开发环境搭建与工具链配置
2.1 PyCharm专业版高效配置
安装PyCharm时务必选择Professional版本,社区版缺少对Django模板调试和数据库工具的支持。我推荐以下必装插件:
- Django Support:提供模板语法高亮和调试
- Database Navigator:统一管理MySQL/PostgreSQL连接
- REST Client:测试API接口的利器
配置Python解释器时,强烈建议使用虚拟环境:
bash复制python -m venv venv
source venv/bin/activate # Linux/Mac
venv\Scripts\activate.bat # Windows
2.2 双框架共存方案
在同一个项目中整合Django和Flask需要特殊处理:
- 先安装核心依赖:
bash复制pip install django flask django-cors-headers
- 项目结构建议:
code复制/project
/django_app # Django主应用
/flask_app # Flask微服务
/shared # 公共工具类
manage.py # Django入口
flask_main.py # Flask入口
3. 数据库设计与ORM实践
3.1 核心表结构设计
电商系统至少要包含这些核心模型:
python复制# Django models.py
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
inventory = models.IntegerField(default=0)
is_active = models.BooleanField(default=True)
class Order(models.Model):
STATUS_CHOICES = [
('P', 'Pending'),
('C', 'Completed'),
('F', 'Failed')
]
user = models.ForeignKey(User, on_delete=models.CASCADE)
total = models.DecimalField(max_digits=12, decimal_places=2)
status = models.CharField(max_length=1, choices=STATUS_CHOICES)
3.2 性能优化技巧
在高并发场景下,我总结了几条实用经验:
- 使用
select_related和prefetch_related减少查询次数 - 对商品列表实现分页缓存:
python复制from django.core.paginator import Paginator
from django.views.decorators.cache import cache_page
@cache_page(60 * 15) # 缓存15分钟
def product_list(request):
page = request.GET.get('page', 1)
paginator = Paginator(Product.objects.all(), 20)
return render(request, 'list.html', {'page': paginator.page(page)})
4. 前后端分离架构实现
4.1 Django REST Framework配置
对于商家后台这类需要复杂数据交互的模块,推荐使用DRF:
python复制# serializers.py
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = '__all__'
extra_kwargs = {'price': {'min_value': 0}}
# views.py
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.filter(is_active=True)
serializer_class = ProductSerializer
permission_classes = [IsAuthenticatedOrReadOnly]
4.2 Flask处理支付回调
支付接口这类需要快速迭代的功能更适合用Flask实现:
python复制from flask import Flask, request, jsonify
import hmac
import hashlib
app = Flask(__name__)
@app.route('/payment/callback', methods=['POST'])
def payment_callback():
sign = request.headers.get('X-Signature')
secret = b'your_wechatpay_secret'
body = request.get_data()
# 验证签名
calculated = hmac.new(secret, body, hashlib.sha256).hexdigest()
if not hmac.compare_digest(sign, calculated):
return jsonify({'code': 403}), 403
# 处理业务逻辑
return jsonify({'code': 200})
5. 部署与性能调优
5.1 生产环境部署方案
我推荐使用Docker Compose编排服务:
yaml复制version: '3'
services:
web:
build: .
command: gunicorn --bind 0.0.0.0:8000 django_app.wsgi:application
ports:
- "8000:8000"
depends_on:
- redis
- db
flask:
build: .
command: gunicorn --bind 0.0.0.0:5000 flask_main:app
ports:
- "5000:5000"
redis:
image: redis:alpine
db:
image: postgres:13
environment:
POSTGRES_PASSWORD: example
5.2 性能监控配置
使用Sentry捕获异常,Prometheus监控性能指标:
python复制# Django settings.py
INSTALLED_APPS += ['sentry_sdk']
import sentry_sdk
sentry_sdk.init(
dsn="your_dsn",
integrations=[DjangoIntegration()],
traces_sample_rate=1.0,
)
# Flask监控配置
from prometheus_flask_exporter import PrometheusMetrics
metrics = PrometheusMetrics(app)
metrics.info('app_info', 'Application info', version='1.0')
6. 安全防护实践
6.1 常见漏洞防护
电商系统必须注意的安全要点:
- CSRF防护:Django默认启用,Flask需要手动添加
python复制# Flask配置
from flask_wtf.csrf import CSRFProtect
csrf = CSRFProtect(app)
- XSS过滤:模板中自动转义
html复制<!-- Django模板 -->
{{ user_input|escape }}
<!-- Flask模板 -->
{{ user_input|e }}
6.2 商家权限系统设计
实现基于角色的访问控制(RBAC):
python复制# Django权限装饰器
from django.contrib.auth.decorators import user_passes_test
def merchant_required(view_func):
actual_decorator = user_passes_test(
lambda u: u.is_authenticated and u.groups.filter(name='Merchant').exists()
)
return actual_decorator(view_func)
7. 项目经验与踩坑记录
在实际开发中,有几个关键点需要特别注意:
- 会话一致性:当Django和Flask共享登录状态时,需要确保SESSION_COOKIE_DOMAIN设置一致,我推荐使用Redis作为共享会话存储:
python复制# Django settings.py
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"
# Flask配置
from flask_session import Session
app.config['SESSION_TYPE'] = 'redis'
Session(app)
- 异步任务处理:对于订单超时处理这类延时任务,使用Celery比纯CRON更可靠:
python复制# tasks.py
@app.task(bind=True)
def check_order_timeout(self, order_id):
order = Order.objects.get(pk=order_id)
if order.status == 'P' and (timezone.now() - order.created_at).days >= 1:
order.status = 'F'
order.save()
send_timeout_notification.delay(order.user.email)
- 日志分级策略:不同环境采用不同日志级别配置:
python复制# logging_config.py
def get_logger_config(debug=False):
return {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG' if debug else 'INFO',
},
},
'root': {
'handlers': ['console'],
'level': 'DEBUG' if debug else 'INFO',
},
}
这个项目架构在实际运行中经受住了"双十一"级别流量考验,峰值时成功处理了每分钟1200+订单。关键优化点在于:数据库连接池配置、Redis缓存预热策略、以及静态资源CDN分发。对于准备开发电商系统的Python开发者,我的建议是:前期用Django快速搭建原型,后期根据业务痛点逐步引入Flask处理特殊场景,这种渐进式架构演进比一开始就追求完美设计更务实有效。
