将Django后端与前端配对

时间:2018-01-30 19:50:55

标签: javascript jquery python ajax django

这是我的问题。

我有一个小的javascript游戏,我试图与Django后端配对,在会话中存储高分,也许将来实现高分榜,登录等。就像前/后端之间的互动练习一样。

到目前为止,我的游戏是在javascript中运行的,我的计划是这样的:获得分数后,它会向django发送一个ajax(jQuery)请求,告诉django增加分数。现在我想到的几个问题是:

  1. 是否可以使用Django / DTL将高分渲染为模板?分数设置为0,每次玩家得分时,对django后端的ajax调用会将分数增加1,并在模板中渲染而不刷新页面。 (还要将其与会话中的高分进行比较,如果新分数更高则覆盖它) 根据我的理解,它需要页面刷新,这不是我想要的。

  2. 我是否应该使用JS增加前端的分数,并在游戏结束后,将分数发送到django后端以将其与会话中的分数等进行比较。

  3. javascript可以访问django视图的值吗? JSON可能吗?

  4. 如果我朝着正确的方向前进,我还在犹豫,所以如果你们能指出我正确的方向。实现这个的最佳方法是什么?

2 个答案:

答案 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',
    })