【问题标题】:Timed Quiz: How to consider internet interruptions?定时测验:如何考虑互联网中断?
【发布时间】:2011-08-25 03:19:05
【问题描述】:

我正在准备 Django 中的测试或测验。测验需要在一定的时间范围内完成。说 30 分钟 40 个问题。我总是可以在测试开始时启动一个时钟,然后在测验完成时计算时间。但是,在尝试期间,可能会出现互联网连接中断、系统崩溃/断电等问题。

我需要一种策略来确定此类事故何时发生,并停止计时,然后让用户从停止的地方再次进行测试,然后重新开始计时。

什么是正确的策略?欢迎任何帮助,包括示例代码/示例/想法

【问题讨论】:

  • 请把“意外”定义得非常清楚。它必须定义得如此明确,以至于没有人会怀疑它的含义。没有一个完全明确的事故定义,这很难做到。

标签: python django session timer


【解决方案1】:

您的策略应取决于考试的重要性和重考整个考试的能力。

  1. 测试/测验是为了乐趣还是能力/知识检查?
  2. 您在处理登录用户吗?
  3. 测试是从大量可用问题中随机生成的吗?

这些是您需要先回答自己的问题。

记住:

  • 恶意用户可以模拟连接中断/电源故障,
  • 您可以信任的唯一时钟是服务器端的时钟,
  • 浏览器端的一切都可以被操纵(想想 firebug/console js 注入)

我的做法是:

  1. 告知用户时间是重要因素,并且在评分时可能不会考虑连接问题...,
  2. 只提供一个问题,等待答案,再提供一个,
  3. 整个测试时间应计算为每个答案时间的SUM
    • 保存每个“发送问题”/“收到答案”时间戳并从中计算答案时间,
    • 问题之间的时间不计算在内,
    • 您将获得更大的范围,了解哪些问题更难/需要更长的时间才能回答。
  4. 向您的问题页面添加某种 heartbeat(例如每隔 X 秒发出一次 ajax 请求),当心跳停止时您可以(取决于您拥有的选项):
    1. 使问题无效并通过对话框通知用户他有连接问题并且必须刷新以获取新问题,而不是如果您有更大的问题要使用
    2. 服务器端暂停时间(例如,问题页面变暗,因此用户在连接恢复之前无法回答)IMO 仅用于游戏/趣味测验/测试
    3. 在每次中断时将信息保存在服务器端,以便稍后做出允许重新进行整个测试的决定例如他一直很好,直到第 20 个问题,然后连续 3-4 个简单的问题,他都放弃了......

【讨论】:

    【解决方案2】:

    与用户的连接中断时暂停时钟的问题在于,用户每次收到新问题时都可以断开计算机与互联网的连接,然后在找到答案后重新连接。

    你可以做的一件事是给用户一定的时间来回答每个问题。

    当用户在浏览器中成功接收到问题时开始计时,如果用户在时限之前提交答案,则接受,否则无效。

    这意味着如果用户失去连接,它只会影响他们当前正在处理的问题。但这也意味着用户将无法灵活决定要为每个问题分配多少时间,由您决定。

    我在想你可以做一些事情,比如从屏幕上删除问题,除非与服务器的连接仍然存在,但用户总是可以在断开连接之前截屏问题。

    【讨论】:

      【解决方案3】:

      要么你在客户端做时钟,在这种情况下,他们总是可以以某种方式作弊,或者你在服务器端做,然后你没有考虑到这些中断。

      为了在一定程度上减少作弊并且仍然允许被打断,你可以做一个“保持活力”。

      这里客户端代码每隔一段时间就会向服务器宣布它仍然存在,比如每 5 秒一次。服务器端记录何时停止获取这些消息,并暂停/停止时钟。但是它仍然有开始和结束时间,所以你知道它真正花了多长时间,以及客户应该在那里花了多长时间。

      通过这两条信息,您可以很容易地追踪到奇怪的行为并将人列入黑名单。被列入黑名单的人可能不知道他们已被列入黑名单,但他们的测验分数不会显示给您测验系统的其他用户。

      【讨论】:

      • 似乎我们的想法完全相同:P
      【解决方案4】:

      最简单的方法是在用户开始测验时添加时间戳,然后将其与提交时进行比较。当然,这并没有考虑到您提到的连接中断、崩溃等。

      为了解决这些问题,我可能会使用 node.js 之类的东西。每个客户在连接到测验时都有“签到”。然后定期(每 1 秒、10 秒、1 米等)客户端签入。如果在这些时间间隔客户端没有签入,您可以假设他们的连接断开了。您可以跟踪他们何时再次连接并从他们中断的地方开始计时。

      这是我对如何跟踪连接断开和崩溃的初步想法。对 Django 视图的前端 ajax 调用也可以做到这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        • 2021-11-13
        • 1970-01-01
        • 2011-09-12
        • 2018-01-09
        • 2011-11-02
        • 2011-04-28
        相关资源
        最近更新 更多