返回首页

Django 和 SQLite 上的 MVP 事件跟踪器:快速分析

本文描述了为 Django 和 SQLite 上的 MVP 创建简约事件跟踪器。该解决方案允许通过 pixel 快速收集关键指标,在项目启动时节省时间和资源。提供了后端和 Next.js 前端的代码示例。

轻量级事件跟踪器:Django + SQLite 用于快速 MVP
Advertisement 728x90

极简事件追踪器:MVP 专用 Django + SQLite + 追踪像素

推出 MVP 时,快速低成本验证核心用户行为至关重要。与其集成笨重的分析平台,不如部署一个轻量级 Django 后端,通过追踪像素收集事件并存入 SQLite。这种方案省时省力,避免复杂基础设施,让你专注测试核心假设。

简单事件追踪器的架构

方案核心是一个极简后端,部署一次在托管服务上,支持多个前端。前端 通过 GET 请求发送事件和来源参数到 /t.gif 端点,后端 原子性递增数据库计数器。通过受保护的 /api/stats 端点查看统计数据,返回 JSON 格式。

关键组件:

Google AdInline article slot
  • 前端:调用 track(event, src) 创建 Image 对象。
  • 后端 (Django):处理请求并在 SQLite 中更新计数器。
  • 数据库:单表包含 eventsrccountupdated_at 字段。
  • 统计 API:密钥认证访问聚合数据。

这种追踪器特别适合免费托管环境,文件系统临时且服务闲置后休眠。

Django 和 SQLite 实现

数据模型极简,在 eventsrc 对上建唯一索引。

# tracker/models.py
from django.db import models

class Counter(models.Model):
    event = models.CharField(max_length=120)
    src = models.CharField(max_length=120, blank=True, default="")
    count = models.PositiveBigIntegerField(default=0)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        unique_together = ("event", "src")

    def __str__(self) -> str:
        return f"{self.src}:{self.event}={self.count}"

事件记录端点返回 1×1 base64 编码像素,规避 CORS 问题,无需额外客户端库。

Google AdInline article slot
# tracker/views.py
import base64

from django.conf import settings
from django.db import transaction
from django.db.models import F
from django.http import HttpResponse, JsonResponse
from django.views.decorators.http import require_GET

from .models import Counter

_GIF_1x1 = base64.b64decode(
    "R0lGODlhAQABAPAAAAAAAAAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=="
)

@require_GET
def pixel(request):
    event = _clean(request.GET.get("e", ""), 120)
    src = _clean(request.GET.get("src", ""), 120)

    if not event:
        return _gif_response()

    with transaction.atomic():
        obj, created = Counter.objects.get_or_create(event=event, src=src)

        if created:
            obj.count = 1
            obj.save(update_fields=["count"])
        else:
            Counter.objects.filter(pk=obj.pk).update(count=F("count") + 1)

    return _gif_response()

通过 F("count") + 1 实现原子更新,确保并发请求下数据一致。统计端点支持按事件和来源过滤。

Next.js 前端集成

客户端提供通用辅助函数,跨项目复用无改动。

// src/utils/track.ts
const TRACK_BASE = "https://your-domain.com/t.gif";

export const track = (event: string, src: string) => {
  const img = new Image();
  img.src =
    `${TRACK_BASE}?` +
    `e=${encodeURIComponent(event)}` +
    `&src=${encodeURIComponent(src)}` +
    `&t=${Date.now()}`;
};

Next.js 组件示例,追踪创建项目按钮点击:

Google AdInline article slot
// src/app/_ui/HomePageClient.tsx
"use client";

import { useRouter } from "next/navigation";
import { track } from "@/utils/track";

export default function HomePageClient() {
  const router = useRouter();

  return (
    <section className="mt-8 space-y-2">
      <div
        className="app-card app-card--soft cursor-pointer hover:border-slate-500/70 hover:bg-white/5 transition-colors"
        role="button"
        tabIndex={0}
        onClick={() => {
          router.push("/demo");
          track("create_project_click", "demo_project");
        }}
      >
        Create Project
      </div>
    </section>
  );
}

通过带认证密钥的 /api/stats 获取统计,响应包含事件触发次数和最后更新时间。

方案优缺点

MVP 轻量追踪器带来实际优势:

  • 快速验证假设:专注一个核心行为,避免海量指标。
  • 资源节省:无需臃肿工具或独立数据库。
  • 高度灵活:一个后端服务多前端和项目。
  • 易部署:最小托管需求,完美适配免费套餐。

但也有天然局限:

  • 无唯一用户或会话追踪。
  • 缺少漏斗、留存或分群分析。
  • 无 A/B 测试或高级报表。

MVP 验证后再逐步扩展。

核心要点

  • 一个指标胜过二十个:MVP 专注测试核心假设的关键行为。
  • 精简基础设施:SQLite + 像素避开部署痛点。
  • 原子操作F("count") + 1 保障高负载数据安全。
  • 通用辅助:10 行客户端代码适配任何现代前端框架。
  • 极速上线:数小时部署,即刻收集数据。

此追踪器无法取代完整分析套件,但低成本解答关键问题:核心行为是否发生?若否,问题多在产品而非缺指标。

— Editorial Team

Advertisement 728x90

继续阅读