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

点击社交分享按钮后异步请求Django视图实现用户加分

实现社交分享时异步请求Django视图加积分的方案

核心思路

通过JavaScript监听分享按钮的点击事件,先异步发送POST请求到Django的积分视图,再打开社交分享链接,既不影响用户分享体验,又能完成积分发放逻辑。


一、后端Django实现

1. 编写积分视图函数

在views.py中添加处理积分发放的视图,确保只允许登录用户访问:

from django.contrib.auth.decorators import login_required
from django.http import JsonResponse

@login_required
def social_share_view(request):
    if request.method == 'POST':
        # 假设用户关联了Profile模型,points字段存储积分
        request.user.profile.points += 100
        request.user.profile.save()
        return JsonResponse({'status': 'success', 'msg': '积分已添加'})
    return JsonResponse({'status': 'error', 'msg': '无效请求'}, status=400)

2. 配置URL路由

在urls.py(core应用下)添加对应路由:

from django.urls import path
from . import views

app_name = 'core'
urlpatterns = [
    # 其他路由...
    path('social-share/', views.social_share_view, name='social-share'),
]

二、前端实现

1. 准备CSRF令牌(Django必填)

在HTML头部添加CSRF令牌的meta标签:

<meta name="csrf-token" content="{{ csrf_token }}">

2. 编写通用异步请求函数

添加JavaScript代码,封装发送积分请求的逻辑:

// 获取Django的CSRF令牌
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;
}
const csrftoken = getCookie('csrftoken');

// 发送积分请求的函数
function sendShareReward() {
    return fetch('{% url "core:social-share" %}', {
        method: 'POST',
        headers: {
            'X-CSRFToken': csrftoken,
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({})
    })
    .then(res => res.json())
    .catch(err => console.error('积分请求失败:', err));
}

3. 处理自定义分享链接(LinkedIn/WhatsApp/Twitter)

给所有自定义分享链接添加统一的类名social-share-btn,然后监听点击事件:

<!-- LinkedIn分享 -->
<a href="https://www.linkedin.com/shareArticle?mini=true&amp;url={{ url_string }}&amp;title=WelcomeTo{{ company.name }}&amp;summary={{ company.name }}&amp;source=mywebsite" 
   class="social-share-btn" target="_blank" rel="noopener">
  <small>Share on Linkedin</small>
</a>

<!-- WhatsApp分享 -->
<a class="text-white mr-2 social-share-btn" 
   href="whatsapp://send?text={{ content_string }}{{ url_string }}" 
   data-action="share/whatsapp/share" target="_blank" rel="noopener">
  <small>Share on Whatsapp</small>
</a>

<!-- Twitter分享 -->
<a href="https://twitter.com/intent/tweet?url={{ url_string }}&text={{ content_string }}" 
   class="social-share-btn" target="_blank" rel="noopener">
  <small>Share on Twitter</small>
</a>

添加点击事件监听:

document.addEventListener('DOMContentLoaded', function() {
    // 监听所有自定义分享按钮
    const shareBtns = document.querySelectorAll('.social-share-btn');
    shareBtns.forEach(btn => {
        btn.addEventListener('click', function(e) {
            e.preventDefault(); // 阻止默认跳转
            const shareUrl = this.href;

            // 先发送积分请求,成功后打开分享链接
            sendShareReward()
                .then(() => window.open(shareUrl, '_blank', 'noopener'))
                .catch(() => {
                    // 请求失败也允许用户分享,不影响体验
                    window.open(shareUrl, '_blank', 'noopener');
                });
        });
    });
});

4. 处理Facebook官方分享按钮

Facebook官方按钮是动态渲染的,需借助其SDK的事件监听:

<!-- Facebook官方分享按钮 -->
<div class="fb-share-button" data-href="{{ url_string }}" data-layout="button_count"></div>

<!-- 加载Facebook SDK -->
<script async defer crossorigin="anonymous" src="https://connect.facebook.net/en_US/sdk.js#xfbml=1&version=v18.0"></script>

添加SDK事件监听(用户完成分享后触发积分请求):

// 在DOMContentLoaded内添加
if (window.FB) {
    FB.Event.subscribe('fb.share', function() {
        sendShareReward();
    });
}

如果希望点击按钮就触发积分请求(不管用户是否完成分享),建议替换为自定义Facebook分享链接,复用前面的social-share-btn逻辑:

<a href="https://www.facebook.com/sharer/sharer.php?u={{ url_string }}" class="social-share-btn" target="_blank" rel="noopener">
  <small>Share on Facebook</small>
</a>

三、注意事项

  • 防重复请求:可以给按钮添加disabled属性,点击后禁用,避免用户多次触发请求。
  • 积分幂等性:建议在视图中添加逻辑,限制用户一定时间内只能获得一次分享积分(比如记录最近分享时间),防止重复加分。
  • 用户校验:视图通过@login_required确保只有登录用户能请求,前端也可提前判断用户登录状态,未登录时提示用户登录。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 22:57:19