You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Django应用跳转外部URI时的额外属性处理与日志记录

实现Django中WhatsApp分享按钮的点击追踪

嘿,作为Django后端开发者,你想通过POST请求追踪分享按钮点击的思路完全可行!下面我给你拆解具体的实现步骤,兼顾日志记录和正常跳转WhatsApp的需求:

第一步:修改前端按钮的交互逻辑

原来的按钮是直接跳转WhatsApp URI的,现在我们需要先触发一个异步POST请求把点击行为记录到后端,再执行跳转——这样用户几乎感觉不到延迟,同时日志也能成功记录。

修改后的前端代码示例:

<button id="whatsapp-share-btn">
  <img src="whatsapp.svg">Share
</button>

<script>
document.getElementById('whatsapp-share-btn').addEventListener('click', async function(e) {
  e.preventDefault();
  const shareUrl = "https://example.com";
  
  try {
    // 先发送POST请求到后端记录日志
    await fetch('/track-whatsapp-share/', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'X-CSRFToken': getCookie('csrftoken') // 处理Django的CSRF令牌
      },
      body: JSON.stringify({
        share_url: shareUrl,
        // 可自定义添加追踪属性,比如来源页面、用户ID
        referrer: window.location.href,
        user_id: '{{ request.user.id|default:"anonymous" }}'
      })
    });
    
    // 日志记录成功后,跳转WhatsApp
    window.location.href = `whatsapp://send?text=${encodeURIComponent(shareUrl)}`;
  } catch (error) {
    // 就算日志请求失败,也不影响用户分享(按需调整)
    window.location.href = `whatsapp://send?text=${encodeURIComponent(shareUrl)}`;
    console.error('Failed to track share:', error);
  }
});

// 辅助函数:获取CSRF令牌Cookie
function getCookie(name) {
  let cookieValue = null;
  if (document.cookie && document.cookie !== '') {
    const cookies = document.cookie.split(';');
    for (let i = 0; i < cookies.length; i++) {
      const cookie = cookies[i].trim();
      if (cookie.substring(0, name.length + 1) === (name + '=')) {
        cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
        break;
      }
    }
  }
  return cookieValue;
}
</script>

第二步:后端Django实现日志记录视图

在你的Django app里新建视图函数,接收前端的POST请求并记录日志:

# views.py
from django.http import JsonResponse
from datetime import datetime
import logging

logger = logging.getLogger(__name__)

def track_whatsapp_share(request):
    if request.method == 'POST':
        # 解析前端传来的参数
        data = request.json
        share_url = data.get('share_url')
        referrer = data.get('referrer')
        user_id = data.get('user_id')
        
        # 方式1:写入日志文件
        logger.info(f"WhatsApp share clicked: User={user_id}, ShareURL={share_url}, Referrer={referrer}, Time={datetime.now()}")
        
        # 方式2:存入数据库(需提前创建ShareLog模型)
        # from .models import ShareLog
        # ShareLog.objects.create(
        #     user_id=user_id,
        #     platform='whatsapp',
        #     share_url=share_url,
        #     referrer=referrer
        # )
        
        return JsonResponse({'status': 'success'})
    else:
        return JsonResponse({'status': 'error', 'message': 'Method not allowed'}, status=405)

接着在urls.py配置路由:

# urls.py
from django.urls import path
from . import views

urlpatterns = [
    # 其他路由...
    path('track-whatsapp-share/', views.track_whatsapp_share, name='track_whatsapp_share'),
]

关键细节说明

  • CSRF保护:Django默认开启CSRF防护,前端AJAX请求必须带上CSRF令牌,上面的getCookie函数就是用来获取令牌的,确保请求能被后端正常接收。
  • 容错处理:就算日志请求失败,也要让用户能正常跳转到WhatsApp,避免影响核心体验。
  • 自定义属性:你可以在前端请求体中加入任何需要追踪的信息(比如设备类型、页面路径),后端直接解析即可。
  • 日志存储:既可以写入Django日志文件,也可以创建专门的数据库模型存储分享记录,方便后续统计分析。

这样就能完美实现点击行为的追踪,同时不影响用户正常使用分享功能啦!

内容的提问来源于stack exchange,提问作者Hassan Baig

火山引擎 最新活动