这是我的问题。
我有一个小的javascript游戏,我试图与Django后端配对,在会话中存储高分,也许将来实现高分榜,登录等。就像前/后端之间的互动练习一样。
到目前为止,我的游戏是在javascript中运行的,我的计划是这样的:获得分数后,它会向django发送一个ajax(jQuery)请求,告诉django增加分数。现在我想到的几个问题是:
是否可以使用Django / DTL将高分渲染为模板?分数设置为0,每次玩家得分时,对django后端的ajax调用会将分数增加1,并在模板中渲染而不刷新页面。 (还要将其与会话中的高分进行比较,如果新分数更高则覆盖它) 根据我的理解,它需要页面刷新,这不是我想要的。
我是否应该使用JS增加前端的分数,并在游戏结束后,将分数发送到django后端以将其与会话中的分数等进行比较。
javascript可以访问django视图的值吗? JSON可能吗?
如果我朝着正确的方向前进,我还在犹豫,所以如果你们能指出我正确的方向。实现这个的最佳方法是什么?
答案 0 :(得分:0)
我认为连续ping服务器是不好的做法。特别是考虑到像游戏这样的东西,很多东西都可以很快地改变。最好的办法是跟踪前端发生的事情,然后根据需要ping服务器以发送或请求信息,查询数据库等(换句话说,请使用数字2,除非您不需要要将它与会话中发生的事情进行“比较”,您只需将完成的游戏信息保存到数据库中。)
总而言之,这取决于游戏的复杂程度以及您决定如何构建它。
答案 1 :(得分:0)
我认为你不需要让Django在每次更新分数时重新渲染页面。
相反,您可以在收到GET请求(返回页面的HTML)时让视图呈现页面,并让jQuery将AJAX POST请求发送到不同的端点(或基于类的视图的post方法)随着游戏状态的每次变化。
如果这样做,您只需让端点返回JsonResponse({"success": True, "msg": "High score updated"})
之类的内容即可。回到客户端,您可以在收到回复后更新分数。
jQuery可能看起来像这样: //请记住使用CSRF保护并相应更新CSRF标头以避免403错误
var newScore = "4000";
$.ajax({
method: 'POST',
url: '/api/updateScore',
data: {
gameID: '12345',
newScore: newScore,
}).done(function(response){
if(response.success){
$("#scorebar").html(newScore);
}
else{
// Error handling
};
});
在Django方面,它可能类似于
# views.py
class GameView(View):
def get(self, request, *args, **kwargs):
return render(request, 'gameboard.html')
def post(self, request, *args, **kwargs):
game_id = int(request.POST['gameID']
game = get_obj_or_404(Game, id=game_id)
game.score = int(request.POST['newScore'])
game.save()
return JsonResponse({
'success': True,
'msg': 'Game saved',
})