You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django电商网站中购买前如何存储推荐码?

推荐链接跟踪的最佳实现方案

针对你的场景,以下几种方案都是成熟可行的,按实现复杂度和实用性排序:

Session 是 Django 中跟踪用户状态的标准方式,结合 Cookie 可以覆盖 Session 失效的场景,确保 unique_id 能持久保存到下单阶段。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 05:26:15