将Django与$.ajax()一起使用

2024-09-19 20:46:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用Django和Ajax做一些简单的事情。你知道吗

我的目标是做一个大厅网站,每个客户都知道大厅里每个人的名字。你知道吗

我这样做的方式(请容忍我,即使这是你听过的最糟糕的方法)是让客户每秒钟发送一条信息,说“我还在这里!”。如果服务器在5秒钟内没有从客户机中删除该客户机,则该客户机将从大厅中的人员列表中删除。我有这个工作。你知道吗

我不知道的是如何将我在Django视图中的球员名单发送回客户端。我一直在尝试使用JsonResponse,然后在$.ajax()调用的success函数中接收它,但我似乎无法让它工作。你知道吗

这是我的电话:

$.ajax({
        url: apiUpdateUrl,
        method: "post",
        data: {
            csrfmiddlewaretoken: Cookies.get("csrftoken")
        },
        dataType: "json",
        success: function(data) {
            console.log(data.player_list)
        }
});

以下是我的Django观点:

def update(request):
    if Player.objects.filter(nickname=request.user.username).count() == 0:
        player = Player(nickname=request.user.username, time_joined=datetime.datetime.now())
        player.save()
    else:
        player = Player.objects.get(nickname=request.user.username)
        player.save()
    curr_time = datetime.datetime.now()
    for player in Player.objects.all():
        if (curr_time - player.last_update).total_seconds() >= 5:
            Player.objects.filter(pk=player.pk).delete()

    player_list = [p.nickname for p in Player.objects.all()]
    print(player_list)
    return JsonResponse({"player_list": player_list})

Tags: djangodatadatetime客户机客户objectstimerequest
1条回答
网友
1楼 · 发布于 2024-09-19 20:46:24

不是解决方案,但我可以推荐一些优化-

1)无需post请求:您可以进行get ajax调用,因为您不发送任何数据。你知道吗

2)您可以这样减少视图中的代码:

def update(request):
    player = Player.objects.get_or_create(defaults={'time_joined': datetime.datetime.now()}, nickname=request.user.username)[0]
    curr_time = datetime.datetime.now()
    Player.objects.filter(last_update__lte=curr_time-datetime.timedelta(seconds=5)).delete()

    player_list = Player.objects.all().values_list('nickname', flat=True)
    print(player_list)
    return JsonResponse({"player_list": player_list})

相关问题 更多 >