как предотвратить несколько голосов от одного пользователя

Я пишу веб-приложение на движке приложений Google с помощью python. Я использую jinja2 в качестве шаблонизатора.

В настоящее время я настроил его так, чтобы пользователи могли голосовать за и против сообщений, но прямо сейчас они могут голосовать за них столько раз, сколько захотят. Я просто храню запись голосования в базе данных, а затем вычисляю ее сразу после этого. Как я могу эффективно запретить пользователям подавать несколько голосов?


person clifgray    schedule 19.07.2012    source источник
comment
Не могли бы вы показать нам, что вы сделали до сих пор?   -  person Conner    schedule 19.07.2012
comment
Что ж, первым шагом будет отключение кнопки, если они уже проголосовали. Следующим шагом будет добавление логики на стороне сервера, чтобы в любом случае следить за этим.   -  person voithos    schedule 19.07.2012
comment
@Conner На самом деле я не на своей машине разработки, но я могу выложить свой текущий код сегодня днем.   -  person clifgray    schedule 19.07.2012


Ответы (2)


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

Вы можете выполнить проверку либо перед тем, как обслуживать страницу (и, таким образом, отключить кнопки голосования), либо когда вы получите попытку голосования (и показать какое-то сообщение). Вероятно, вам следует написать код для обработки обоих сценариев, если голосование действительно важно для вас.

person Marcin    schedule 19.07.2012
comment
Сначала я думал, что простой оператор if сработает, но что, если у меня будет 10 000 голосов? (явно еще нет) не будет ли несколько неэффективно проверять все голоса за пользователя? или это не так дорого процессор, как я думаю - person clifgray; 19.07.2012
comment
@clifgray Вы должны использовать функции запросов вашей базы данных, чтобы сделать это эффективно. - person Marcin; 19.07.2012
comment
ах хорошо, это имеет больше смысла. спасибо, это должно быть достаточно просто реализовать. - person clifgray; 19.07.2012

Я предлагаю создать метод toggleVote, который принимает ключ элемента, за который вы хотите включить голосование, и ключ пользователя, делающего голосование.

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

"keyOfUserVoting", "keyOfItemBeingVotedOn"

Таким образом, вы можете просто выполнить запрос, в котором ключи совпадают, и если элемент существует, вы знаете, что пользователь проголосовал за этот элемент. (Query where keyOfUserVoting = 'param1' and keyOfItemVoted='param2', if result != None, значит пользователь проголосовал)

Для метода toggleVote() случай может быть очень простым:

toggleVote(keyOfUserVoting, keyOfItemToVoteOn):
    if (queryResultExists):
        // delete this record from the 'votes' table
    else:
        // add record to the 'votes' table

Таким образом, вам никогда не придется беспокоиться об индивидуальном отслеживании того, сколько раз пользователь проголосовал или нет.

Таким же образом, если вы хотите узнать, сколько голосов подано за элемент, вы можете сделать еще один запрос, чтобы быстро count where keyOfItemToVoteOn = paramKeyOfItem. Опять же, с GAE это будет очень быстро.

В этой настройке вы также можете быстро узнать, сколько раз пользователь проголосовал за один элемент (count where userKey = value and where itemKey = value) или сколько раз пользователь проголосовал за всю систему (count where userKey = value)...

Наконец, для большей надежности вы можете обернуть обновления в методе toggleVote() в транзакцию, особенно если вы будете выполнять другие действия с пользователем или элементом, за который голосуют.

Надеюсь это поможет.

person Cuga    schedule 19.07.2012
comment
быстро и считать противоположны. - person Nick Johnson; 20.07.2012
comment
Запросы к хранилищу данных GAE выполняются за линейное время, а функция count() быстрее на постоянный коэффициент, чем фактическое извлечение всех результатов. Тем не менее, да, чтобы быстро подсчитать количество голосов, OP может увеличивать/уменьшать «voteCount» для элемента, который затем извлекается в любое время, когда требуется быстрый голосовой подсчет - операция увеличения/уменьшения является частью того, что будет относятся к сделке, которую я упоминаю в ответе. - person Cuga; 20.07.2012