Timed Quiz: Как учесть интернет-прерывания - PullRequest
4 голосов
/ 13 мая 2011

Я готовлю тест или викторину в Джанго.Викторина должна быть завершена в определенные сроки.Скажите 30 минут на 40 вопросов. Я всегда могу запустить часы в начале теста, а затем рассчитать время к тому времени, когда тест завершен.Однако вполне вероятно, что во время попытки могут возникнуть проблемы, такие как обрыв соединения с Интернетом, сбой системы / перебои в подаче электроэнергии и т. Д.

Мне нужна стратегия, чтобы выяснить, когда произошла такая авария, и остановить часы,затем позвольте пользователю снова пройти тест с того места, где он остановился, и снова запустить часы.

Какова правильная стратегия?Любая помощь, включая пример кода / примеры / идеи, приветствуется

Ответы [ 4 ]

2 голосов
/ 16 мая 2011

Ваша стратегия должна зависеть от важности теста и способности пересдать весь тест.

  1. Является ли тест / викторина для развлечения или проверки компетенции / знаний?
  2. Вы имеете дело сзарегистрированные пользователи?
  3. Генерируются ли тесты случайным образом из большого опроса доступных вопросов?

На эти вопросы вы должны сначала ответить себе.

Помните, что:

  • злоумышленник МОЖЕТ имитировать сбой соединения / сбой питания,
  • только часы, которым можно доверять, - это один на стороне сервера,
  • всем на стороне браузера можно манипулировать (подумайтеfirebug / console js инъекция)

Мой подход будет следующим:

  1. Сообщите пользователям, что ВРЕМЯ является важным фактором, и проблемы с подключением могут не учитываться при оценке...,
  2. Подавать только один вопрос , ждать ответа, подавать другой,
  3. Все время теста следует рассчитывать как SUM извремя каждого ответа:
    • сохраняйте все временные метки "отправленный вопрос" / "полученный ответ" и вычисляйте из них время ответа,
    • время между вопросами не будет учитываться,
    • вы получите дополнительную областьна какие вопросы было сложнее / на них требовалось больше времени.
  4. Добавьте какой-нибудь сердцебиение на страницу вопросов (например, запрос ajax каждые X секунд), когда сердцебиение прекращаетсяВы можете (в зависимости от имеющихся у вас опций):
    1. сделать недействительным вопрос и уведомить пользователя через диалоговое окно, что у него возникли проблемы с соединением, и ему нужно обновить, чтобы получить новый вопрос вместо , если у вас есть большой опрос вопросов для использования ,
    2. время паузы на стороне сервера (и, например, страница с тусклым вопросом, поэтому пользователь не может ответить, пока его соединение не восстановлено) IMO только для игр / веселых викторин / тестов
    3. сохранять информацию на стороне сервера при каждом прерывании, что впоследствии облегчит принятие решения о повторном прохождении всего теста например, он был в порядке до 20-го вопроса, а затем по 3-4 простых вопроса подрядон сбрасывал ...
2 голосов
/ 13 мая 2011

Либо вы делаете часы на стороне клиента, в этом случае они всегда могут каким-то образом обмануть, либо вы делаете это на стороне сервера, и тогда вы не учитываете эти прерывания.

Чтобы немного снизить уровень мошенничества и по-прежнему допускать перерывы, вы можете сделать «поддержание жизни».

Здесь код на стороне клиента объявляет серверу, что он все еще там, часто, скажем, каждые 5 секунд. Серверная сторона отмечает, когда он прекращает получать эти сообщения, и приостанавливает / останавливает часы. Однако у него все еще есть время начала и окончания, так что вы знаете, сколько времени действительно заняло время на стене, а также сколько времени потребовалось, пока клиент предположительно находился там.

С помощью этих двух частей информации вы можете очень легко отследить странное поведение и занести людей в черный список. Люди из черного списка могут не знать, что они в черном списке, но их оценки не отображаются для других пользователей вашей системы.

2 голосов
/ 13 мая 2011

Самый простой способ - добавить временную метку, когда человек начинает тест, а затем сравнить ее с тем, когда он отправляет. Конечно, это не учитывает потери соединения, сбои и т. Д., Как вы упомянули.

Чтобы учесть эти проблемы, я бы, вероятно, использовал что-то вроде node.js. У каждого клиента есть «регистрация», когда они подключаются к викторине. Затем через равные промежутки времени (каждые 1 с, 10 с, 1 м и т. Д.) Клиент регистрируется. Если через эти интервалы клиент не регистрируется, можно предположить, что у него было разорвано соединение. Вы можете отслеживать, когда они снова подключатся, и запустить таймер с того места, где они остановились.

Это моя первая мысль о том, как отслеживать разрывы и сбои соединения. То же самое можно сделать с помощью внешнего вызова ajax для представления Django.

0 голосов
/ 13 мая 2011

Проблема с остановкой часов, когда разрывается соединение с пользователем, заключается в том, что пользователь может просто отключать свой компьютер от Интернета каждый раз, когда он получает новый вопрос, а затем повторно подключаться, как только он выработает ответ.

Одна вещь, которую вы могли бы сделать, это дать пользователю определенное количество времени для каждого вопроса.

Часы запускаются, когда пользователь успешно получает вопрос в свой браузер, и если пользователь отправляетответ до установленного срока принимается, в противном случае он считается недействительным.

Это означает, что если пользователь потеряет соединение, это повлияет только на вопрос, на котором он в данный момент находится.Но это также означало бы, что у пользователя не будет гибкости в том, сколько времени он хочет выделить на каждый вопрос, вы решаете за него.

Я думал, что вы могли бы сделать что-то вроде удаления вопроса с экрана, если толькосоединение с сервером было еще живо, но пользователь всегда мог просто снять вопрос с экрана, прежде чем отключиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...