0

0

Django教程:使用AJAX将JavaScript游戏分数传输并存储到后端模型

花韻仙語

花韻仙語

发布时间:2025-12-12 22:54:59

|

522人浏览过

|

来源于php中文网

原创

django教程:使用ajax将javascript游戏分数传输并存储到后端模型

本教程详细介绍了如何在Django应用中高效地将前端JavaScript游戏分数传输并存储到后端模型。我们将摒弃传统的隐藏表单提交方式,转而采用更现代、灵活的AJAX技术。文章涵盖了Django模型、视图的后端配置,以及前端JavaScript/jQuery通过AJAX构建并发送JSON数据的方法,旨在帮助开发者构建稳定且用户友好的游戏高分榜功能。

引言:前端游戏分数与后端持久化

在Web游戏中,将玩家在前端(通常是JavaScript)获得的分数持久化到后端数据库是一个常见的需求,以便构建高分榜或记录玩家进度。初学者可能倾向于使用传统的HTML表单提交方式,例如创建一个隐藏的POST表单来传递分数。然而,这种方法往往不够灵活,需要页面刷新,并且在处理单点数据提交时显得笨重。

相比之下,使用异步JavaScript和XML (AJAX) 技术是更优的选择。AJAX允许前端在不刷新页面的情况下与后端进行通信,发送数据并接收响应,从而提供更流畅的用户体验。本教程将指导您如何在Django项目中,利用jQuery的AJAX功能,将JavaScript游戏分数安全、高效地存储到Django模型中。

Django后端配置

首先,我们需要在Django项目中设置好接收和处理分数的后端逻辑。

立即学习Java免费学习笔记(深入)”;

1. 定义高分榜模型 (models.py)

创建一个模型来存储玩家分数。这个模型通常会关联到Django的内置User模型,以便记录是哪个玩家获得了分数。

# myapp/models.py
from django.db import models
from django.contrib.auth.models import User # 导入Django的User模型

class Ranking(models.Model):
    """
    高分榜模型,用于存储玩家的游戏分数。
    """
    player = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="玩家")
    game_overall_score = models.IntegerField(verbose_name="游戏总分", default=0)
    submission_date = models.DateTimeField(auto_now_add=True, verbose_name="提交日期")

    class Meta:
        ordering = ['-game_overall_score', 'submission_date'] # 按分数降序排列
        verbose_name = "高分榜记录"
        verbose_name_plural = "高分榜记录"

    def __str__(self):
        return f"{self.player.username} - {self.game_overall_score}"

说明:

  • player:一个外键,关联到User模型,确保每个分数都与一个注册用户相关联。
  • game_overall_score:存储游戏分数的整数字段。
  • submission_date:记录分数提交时间,有助于排序和追踪。

完成模型定义后,记得运行python manage.py makemigrations和python manage.py migrate来创建数据库表。

2. 创建分数提交视图 (views.py)

接下来,我们需要编写一个视图函数来处理前端发送的AJAX POST请求。这个视图将负责接收JSON格式的分数数据,验证其有效性,并将其保存到Ranking模型中。

# myapp/views.py
import json
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.contrib.auth.decorators import login_required
from django.views.decorators.csrf import csrf_exempt # 通常不推荐直接使用,但在API场景下有时会考虑

from .models import Ranking

@require_POST # 确保只接受POST请求
@login_required # 确保只有登录用户才能提交分数
# @csrf_exempt # 如果前端不发送CSRF token,可以使用此装饰器跳过CSRF验证,但安全性会降低。
               # 推荐在前端发送X-CSRFToken头部。
def submit_game_score(request):
    """
    处理通过AJAX提交的游戏分数。
    接收JSON格式的数据,并保存到Ranking模型。
    """
    if not request.user.is_authenticated:
        return JsonResponse({'status': 'error', 'message': '用户未登录'}, status=401)

    try:
        # 解析请求体中的JSON数据
        data = json.loads(request.body)
        score = data.get('game_overall_score')

        if score is None or not isinstance(score, int):
            return JsonResponse({'status': 'error', 'message': '分数无效或未提供'}, status=400)

        # 可选:对分数进行进一步的服务器端验证,例如范围检查
        if score < 0:
            return JsonResponse({'status': 'error', 'message': '分数不能为负数'}, status=400)

        # 创建并保存Ranking实例
        Ranking.objects.create(
            player=request.user, # 直接使用当前登录用户
            game_overall_score=score
        )
        return JsonResponse({'status': 'success', 'message': '分数保存成功'})

    except json.JSONDecodeError:
        return JsonResponse({'status': 'error', 'message': '无效的JSON数据'}, status=400)
    except Exception as e:
        # 捕获其他可能的异常,如数据库错误
        return JsonResponse({'status': 'error', 'message': f'服务器内部错误: {str(e)}'}, status=500)

说明:

  • @require_POST:确保此视图只响应POST请求。
  • @login_required:强制用户必须登录才能提交分数,确保request.user可用。
  • json.loads(request.body):解析前端发送的JSON格式请求体。
  • data.get('game_overall_score'):从解析后的数据中获取分数。
  • 服务器端验证:对分数进行类型和值验证是防止作弊和确保数据完整性的关键步骤。
  • Ranking.objects.create(...):使用当前登录用户和分数创建新的Ranking记录。
  • JsonResponse:返回JSON格式的响应,告知前端操作结果。

3. 配置URL路由 (urls.py)

将视图函数映射到一个URL路径,以便前端可以通过该URL发送AJAX请求。

# myproject/urls.py (项目级的urls.py) 或 myapp/urls.py (应用级的urls.py)
from django.urls import path
from myapp import views # 假设您的views.py在myapp应用中

urlpatterns = [
    # ... 其他URL配置 ...
    path('api/submit-score/', views.submit_game_score, name='submit_game_score'),
]

说明:

  • 我们定义了一个API端点/api/submit-score/,前端将向此URL发送分数。

前端JavaScript/jQuery实现

现在,我们来编写前端代码,负责在游戏结束后或特定事件触发时,将分数通过AJAX发送到Django后端。

听脑AI
听脑AI

听脑AI语音,一款专注于音视频内容的工作学习助手,为用户提供便捷的音视频内容记录、整理与分析功能。

下载

1. 获取CSRF Token

Django的POST请求需要CSRF(跨站请求伪造)令牌进行安全验证。对于AJAX请求,我们需要从页面中获取这个令牌并将其作为请求头发送。

在Django模板中,您可以将CSRF token嵌入到HTML的meta标签或隐藏的input字段中:

<!-- 在head部分添加,或者在body的任何位置 -->
<meta name="csrf-token" content="{{ csrf_token }}">

<!-- 或者在表单中获取 -->
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}">

然后,在JavaScript中获取它:

// 方法一:从meta标签获取
const csrftoken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');

// 方法二:从隐藏的input字段获取
// const csrftoken = document.querySelector('input[name="csrfmiddlewaretoken"]').value;

// 方法三:从cookie中获取(Django默认将CSRF token存储在名为'csrftoken'的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;
}
const csrftoken = getCookie('csrftoken');

推荐使用meta标签或cookie方法,因为它更通用,不依赖于页面上是否存在表单。

2. 准备数据并发送AJAX请求

假设您的游戏逻辑中有一个score变量用于跟踪当前分数。当游戏结束时,您可以触发一个函数来提交这个分数。

// 假设这是您的游戏分数变量
var score = 0; 

// ... 您的游戏逻辑,例如分数增加和重置 ...
// if (frameCount % 5 == 0) {
//     score++;
// }
// if (pipes[i].hits(bird)) {
//     score = 0;
//     pipes = [];
//     return;
// }

// 当需要提交分数时调用此函数,例如在游戏结束时
function submitHighScore(currentScore) {
    const dataToSend = {
        'game_overall_score': currentScore
    };

    $.ajax({
        url: "/api/submit-score/", // 替换为您的Django URL
        type: "POST",
        contentType: "application/json", // 告诉服务器我们发送的是JSON数据
        headers: {
            'X-CSRFToken': csrftoken // 将CSRF token作为请求头发送
        },
        data: JSON.stringify(dataToSend), // 将JavaScript对象转换为JSON字符串
        success: function(response){
            // 分数提交成功后的处理
            console.log("分数提交成功:", response);
            alert("您的分数已成功提交!");
            // 您可以在这里更新UI,例如显示高分榜或成功消息
        },
        error: function(xhr, status, error){
            // 分数提交失败后的处理
            console.error("分数提交失败:", xhr.responseText);
            let errorMessage = "提交分数时发生错误。";
            try {
                const errorResponse = JSON.parse(xhr.responseText);
                errorMessage = errorResponse.message || errorMessage;
            } catch (e) {
                // 如果响应不是JSON,则使用默认错误消息
            }
            alert("提交分数失败:" + errorMessage);
            // 您可以在这里显示错误消息给用户
        }
    });
}

// 示例:通过一个按钮点击事件触发分数提交
// 假设页面上有一个ID为'submit-score-button'的按钮
$("#submit-score-button").on("click", function(){
    submitHighScore(score); // 提交当前的游戏分数
});

// 或者在游戏结束时自动触发
// function gameOver() {
//     // ... 游戏结束逻辑 ...
//     submitHighScore(score);
// }

说明:

  • dataToSend:构建一个JavaScript对象,其键值对与Django视图期望的JSON结构匹配。
  • contentType: "application/json":非常重要,它告诉Django服务器我们发送的数据是JSON格式。
  • headers: {'X-CSRFToken': csrftoken}:将获取到的CSRF token添加到请求头中,这是Django进行CSRF验证的方式。
  • data: JSON.stringify(dataToSend):将JavaScript对象转换为JSON字符串,这是通过HTTP发送JSON数据的标准方式。
  • success和error回调函数:分别处理请求成功和失败的情况,并可以根据后端返回的JsonResponse内容进行相应的用户反馈。

安全性与最佳实践

在实现游戏分数提交功能时,除了基本的数据传输,还需要考虑一些重要的安全性和最佳实践:

  1. 服务器端数据验证

    • 防止作弊:前端提交的分数很容易被篡改。因此,后端必须对接收到的分数进行严格的验证,例如检查分数是否为正数、是否在合理范围内(如果游戏有最大分数限制),甚至可以通过某种方式验证分数的合法性(例如,如果游戏是回合制的,后端可以记录每回合的得分并计算总分)。
    • 数据类型和完整性:确保分数是整数,并且没有缺失。
  2. CSRF防护

    • 如上所述,始终通过X-CSRFToken请求头将CSRF token发送到Django后端,除非您明确知道自己在做什么并承担风险,否则不要使用@csrf_exempt。
  3. 用户认证与授权

    • 使用@login_required装饰器确保只有登录用户才能提交分数。这防止了匿名用户提交分数,并确保分数与正确的用户关联。
    • 在视图中,直接使用request.user来获取当前登录的用户,而不是让前端传递用户ID或用户名。这更安全,因为前端无法伪造用户身份。
  4. 用户体验与错误处理

    • 提供清晰的用户反馈:无论分数提交成功还是失败,都应通过弹窗、消息提示或UI更新告知用户结果。
    • 详细的错误信息:在error回调中,从xhr.responseText中解析后端返回的错误信息,并向用户展示有用的提示,而不是泛泛的“发生错误”。

总结

通过本教程,您应该已经掌握了如何利用AJAX技术,在Django项目中实现JavaScript游戏分数的安全、高效传输与存储。相比于传统的隐藏表单提交,AJAX提供了更流畅的用户体验和更灵活的数据交互方式。关键步骤包括:在Django中定义高分榜模型、创建处理JSON数据的视图、配置URL路由,以及在前端使用jQuery的$.ajax()方法构建并发送带有CSRF token的JSON请求。遵循安全性最佳实践,如服务器端验证和用户认证,将有助于构建一个健壮且可靠的游戏高分榜系统。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python Web 框架 Django 深度开发
Python Web 框架 Django 深度开发

本专题系统讲解 Python Django 框架的核心功能与进阶开发技巧,包括 Django 项目结构、数据库模型与迁移、视图与模板渲染、表单与认证管理、RESTful API 开发、Django 中间件与缓存优化、部署与性能调优。通过实战案例,帮助学习者掌握 使用 Django 快速构建功能全面的 Web 应用与全栈开发能力。

167

2026.02.04

json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

457

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

549

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

82

2025.09.10

jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

156

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

337

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

406

2023.11.10

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

26

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.4万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号