Django电商网站中购买前如何存储推荐码?
推荐链接跟踪的最佳实现方案
针对你的场景,以下几种方案都是成熟可行的,按实现复杂度和实用性排序:
1. Session + Cookie 组合(最推荐)
Session 是 Django 中跟踪用户状态的标准方式,结合 Cookie 可以覆盖 Session 失效的场景,确保 unique_id 能持久保存到下单阶段。
步骤1:修改 referral 视图,存入 Session 并设置 Cookie
from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, reverse from .models import OriginOrder def referral(request, unique_id): # 先验证 unique_id 的有效性 get_object_or_404(OriginOrder, unique_id=unique_id) # 将 referral_id 存入 Session,设置30天有效期(可根据业务调整) request.session['referral_unique_id'] = unique_id request.session.set_expiry(2592000) # 30天 = 30*24*60*60秒 # 设置 HttpOnly Cookie,作为 Session 的 fallback response = HttpResponseRedirect(reverse("store")) response.set_cookie( key='referral_unique_id', value=unique_id, max_age=2592000, httponly=True, # 禁止前端JS读取,提升安全性 secure=request.is_secure(), # 生产环境启用HTTPS时设为True samesite='Lax' # 防范CSRF攻击 ) return response
步骤2:下单时获取并验证 referral_id
在创建订单的视图中,优先从 Session 取,Session 不存在则从 Cookie 取,最后一定要再次验证 ID 的有效性:
def create_order(request): # 按优先级获取 referral_id referral_id = request.session.get('referral_unique_id') if not referral_id: referral_id = request.COOKIES.get('referral_unique_id') if referral_id: try: # 再次验证ID有效性,防止伪造 origin_order = OriginOrder.objects.get(unique_id=referral_id) # 将 referral 关联到当前订单(假设订单模型有 referral_order 字段) order.referral_order = origin_order order.save() # 这里触发给推荐人发奖励的逻辑 except OriginOrder.DoesNotExist: # 无效ID,直接忽略 pass # 剩余下单逻辑...
2. 仅使用 Session(快速实现)
如果不需要考虑用户禁用 Cookie 的极端场景,仅用 Session 就能满足需求,代码更简洁:
def referral(request, unique_id): get_object_or_404(OriginOrder, unique_id=unique_id) request.session['referral_unique_id'] = unique_id request.session.set_expiry(2592000) return redirect(reverse("store"))
下单时直接从 request.session.get('referral_unique_id') 获取即可,同样要做有效性验证。
3. 匿名用户关联(持久跟踪)
如果需要更长时间的跟踪(比如用户隔了一周再来下单),可以创建匿名用户模型,将 unique_id 关联到匿名用户,用 Cookie 存储匿名用户 ID:
步骤1:创建匿名用户模型
from django.db import models class AnonymousVisitor(models.Model): visitor_id = models.CharField(max_length=64, unique=True) referral_unique_id = models.CharField(max_length=64, null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True)
步骤2:referral 视图中关联匿名用户
import uuid from .models import AnonymousVisitor def referral(request, unique_id): get_object_or_404(OriginOrder, unique_id=unique_id) # 获取或创建匿名用户 visitor_id = request.COOKIES.get('visitor_id') if not visitor_id: visitor_id = str(uuid.uuid4()) visitor, _ = AnonymousVisitor.objects.get_or_create(visitor_id=visitor_id) visitor.referral_unique_id = unique_id visitor.save() # 设置匿名用户ID的Cookie response = redirect(reverse("store")) response.set_cookie('visitor_id', visitor_id, max_age=31536000) # 1年有效期 return response
步骤3:下单时通过匿名用户获取 referral_id
def create_order(request): visitor_id = request.COOKIES.get('visitor_id') if visitor_id: try: visitor = AnonymousVisitor.objects.get(visitor_id=visitor_id) referral_id = visitor.referral_unique_id if referral_id: origin_order = OriginOrder.objects.get(unique_id=referral_id) order.referral_order = origin_order order.save() except (AnonymousVisitor.DoesNotExist, OriginOrder.DoesNotExist): pass # 剩余下单逻辑...
关键注意事项
- 每次用户通过新的推荐链接访问时,要覆盖已有的
referral_id(以最新的推荐来源为准)。 - 无论哪种方案,下单时必须再次验证 referral_id 的有效性,防止用户伪造 Session/Cookie 值。
- 不要在前端存储推荐人的敏感信息,仅存储
unique_id,需要时通过 ID 查询推荐人信息。
内容的提问来源于stack exchange,提问作者Mahdi
相关产品推荐
相关产品推荐

