如何在 while 循环中打印 HttpResponse 然后在每个循环中附加到它?

How to print a HttpResponse in a while loop and then append onto it for each loop?

好的,我有这样的看法:

def fight(request):
    monster = Monster.objects.get(pk=request.POST['monster'])
    user = Profile.objects.get(pk=2)
    while monster.health > 0 and user.health > 0:
        monsterattack = random.randint(monster.minattack, monster.maxattack)
        userattack = random.randint(user.attack*.75, user.attack*1.5)
        user.health = user.health - monsterattack
        monster.health = monster.health - userattack
        HttpResponse('Player attacked for: %s\n Monster attacked for: %s\n' % (userattack, monsterattack))
    return HttpResponse('You are fighting %s\n Player Health: %s \n Monsters Health: %s' % (monster.name, user.health, monster.health))

我想知道是否有一种方法可以在每次循环时将第一个 HttpResponse 打印到模板,然后在 while 循环完成后打印第二个 while 循环。

一个视图应该 return 一个 HTTPResponse。将多个 HttpResponse 个对象加在一起没有意义。

您可以连接字符串和 return 单个 res

def fight(request):
    out = ""
    while monster.health > 0 and user.health > 0:
        out += 'Player attacked for: %s\n Monster attacked for: %s\n' % (userattack, monsterattack)
    out += 'You are fighting %s\n Player Health: %s \n Monsters Health: %s' % (monster.name, user.health, monster.health)
    return HttpResponse(out)

另一个常见的模式是生成一个字符串列表,然后在最后加入它们。这可能比连接字符串更快,但我不确定在这种情况下您是否会看到任何明显的差异:

def fight(request):
    out = []
    while monster.health > 0 and user.health > 0:
        out.append('Player attacked for: %s\n Monster attacked for: %s' % (userattack, monsterattack))
    out.append('You are fighting %s\n Player Health: %s \n Monsters Health: %s' % (monster.name, user.health, monster.health)
    return HttpResponse("\n".join(out))

仅查看一次 returns 一个回复。你想要的将需要 ajax 轮询(简单但效率不高)或 websockets(更复杂 - 查看 django-channels 了解如何在 Django 中使用 - 但对于你的应用程序类型可能更有效)。