1. 项目背景与核心需求
作为一个长期混迹在技术圈的老码农,最近用Django做了个诗词网站,没想到上线后还挺受欢迎。这个项目的初衷很简单:现在年轻人对传统文化越来越感兴趣,但市面上大多数诗词平台要么太学术化,要么交互体验差。我们团队就想做个既有专业内容又能让用户玩起来的平台。
从技术角度看,这个项目要解决三个核心问题:
- 如何高效管理海量诗词数据(我们最终收录了超过10万首作品)
- 如何实现个性化的内容推荐(让不同喜好的用户都能找到感兴趣的内容)
- 如何设计友好的互动功能(评论、创作、社交都要考虑)
2. 技术架构设计
2.1 后端选型决策
选择Django不是偶然。我们对比过Flask和FastAPI,最终选择Django主要基于:
- 自带Admin后台(对非技术运营人员友好)
- ORM的成熟度(处理复杂诗词关系时更省心)
- 社区生态完善(遇到问题容易找到解决方案)
实际开发中,我们特别依赖Django的这些特性:
# 典型模型设计示例 class Poem(models.Model): title = models.CharField(max_length=100) author = models.ForeignKey('Poet', on_delete=models.CASCADE) dynasty = models.CharField(max_length=20) content = models.TextField() tags = TaggableManager() # 使用django-taggit实现多标签 class Meta: indexes = [ models.Index(fields=['title']), GinIndex(fields=['content'], name='content_gin_idx', opclasses=['gin_trgm_ops']) # 启用全文搜索 ]2.2 前端技术栈
虽然现在流行前后端分离,但我们选择了Django模板引擎+少量AJAX的方案,主要考虑:
- 内容型网站SEO需求强烈
- 开发团队更熟悉传统Web开发模式
- 项目初期需要快速迭代
关键的前端优化点:
- 使用Turbolinks实现页面局部刷新
- 针对诗词展示特别优化了排版CSS
- 用StimulusJS处理交互逻辑
3. 核心功能实现细节
3.1 智能推荐系统
推荐算法是我们最下功夫的部分。最终实现的混合推荐方案包含:
- 基于内容的推荐(TF-IDF+余弦相似度)
- 协同过滤(用户行为矩阵分解)
- 热门榜单(实时计算)
# 推荐算法核心代码片段 def hybrid_recommend(user): # 获取用户历史行为 history = UserBehavior.objects.filter(user=user) # 内容相似度推荐 content_based = Poem.objects.annotate( similarity=TrigramSimilarity('content', history.last().poem.content) ).order_by('-similarity')[:5] # 协同过滤推荐 cf_based = get_cf_recommendations(user.id) # 合并结果并去重 return list({p.id: p for p in chain(content_based, cf_based)}.values())[:10]3.2 高并发优化
诗词网站在早晚高峰经常出现流量激增(特别是节假日期间)。我们做了这些优化:
- 使用Redis缓存热门诗词和排行榜
- 对列表页实现分页缓存
- 数据库读写分离配置
实测优化前后对比:
| 场景 | QPS | 平均响应时间 |
|---|---|---|
| 优化前 | 120 | 850ms |
| 优化后 | 1500 | 120ms |
4. 开发中的经验教训
4.1 诗词数据处理坑
最初直接从网络抓取的诗词数据遇到这些问题:
- 编码混乱(GBK/UTF-8混用)
- 标点不统一(全角/半角混用)
- 作者信息不准确
解决方案:
- 开发专门的清洗脚本
- 建立人工审核流程
- 使用OpenCC处理简繁转换
4.2 搜索功能优化
默认的数据库全文搜索效果不佳,我们最终采用:
- PostgreSQL+pg_trgm扩展
- 对高频词建立停用词表
- 实现拼音搜索支持
5. 部署与运维实践
5.1 生产环境配置
我们的部署架构:
- Nginx作为前端代理
- Gunicorn运行Django应用
- Supervisor管理进程
- Sentry监控错误
关键配置项:
# Nginx优化配置 location / { proxy_cache poetry_cache; proxy_pass http://gunicorn; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 静态资源缓存 location ~* \.(jpg|css|js)$ { expires 30d; } }5.2 性能监控方案
搭建的监控体系包括:
- Prometheus收集指标
- Grafana展示仪表盘
- 自定义的诗词访问热力图
6. 项目扩展方向
目前正在开发的进阶功能:
- 诗词自动标注系统(使用spaCy训练NLP模型)
- 用户创作辅助工具(平仄检查、韵脚提示)
- 移动端APP(基于Flutter开发)
这个项目给我的最大启示是:技术要为内容服务。我们花了大量时间研究如何更好地展示诗词的文学价值,而不仅仅是追求技术的新颖性。比如在实现"相关推荐"时,除了算法精度,我们更关注推荐结果是否具有文学上的关联性。