Javascript 如何使用Django和Evercookie创建非常简单的匿名投票系统?

Javascript 如何使用Django和Evercookie创建非常简单的匿名投票系统?,javascript,python,django,cookies,evercookie,Javascript,Python,Django,Cookies,Evercookie,我正在尝试为匿名用户创建一个基本的上下投票系统,这些用户不需要登录,这样任何访问者都可以推一次并输入投票。显然,我们必须限制人们只能投一票。经过一些研究,但django评级模块没有成功,我发现对于django来说,这是实现这一能力最有希望的方法。但是,我需要一些帮助来编写代码的一部分,该部分比较当前在对象上投票的EverCookie与可能传入的代码。我想我还有很多其他的事情要解决 我的基本django模型对象的核心是一个提交的URL,其中包含一个用于跟踪类似内容的整数字段: class new

我正在尝试为匿名用户创建一个基本的上下投票系统,这些用户不需要登录,这样任何访问者都可以推一次并输入投票。显然,我们必须限制人们只能投一票。经过一些研究,但django评级模块没有成功,我发现对于django来说,这是实现这一能力最有希望的方法。但是,我需要一些帮助来编写代码的一部分,该部分比较当前在对象上投票的EverCookie与可能传入的代码。我想我还有很多其他的事情要解决

我的基本django模型对象的核心是一个提交的URL,其中包含一个用于跟踪类似内容的整数字段:

 class newlink(models.Model):

    linktag = models.ForeignKey(‘pagename’) #the page the link belongs in
    linkcomment = models.CharField(max_length=128) #comment to go along with post
    postlinkdate = models.DateTimeField(auto_now_add=True) #submission datestamp
    url = models.URLField(max_length = 1024) 
    linklikescounter = models.IntegerField(null=False, default=0) #this is what will be changed up or down per vote
    # Do I need another field(s) in this model to store evercookie data? Or maybe a new "likevote" class that has a ForeignKey relationship to the newlink class? 


def __unicode__(self):
    return self.url
我的模板中有一个简单的按钮/表单:

<form action="/{{pagename_param}}" method="post">
     {% csrf_token %}
     <input type="hidden" name="linkset_likeid" value="{{ linkset.id }}">
     <input type="submit" class="btn" value="like" name="linklikebtn"/>
     </form>

如果这个问题仍然有效,你可能想看看


根据您的问题:您可以在处理请求时拒绝重复投票(例如,表单验证-调用evercookie的get方法,如果它返回某些内容-将其放入隐藏字段)或者进行DB/模型级验证,在这种情况下,这可能是一种过激行为。

请注意,您的代码引入了竞争条件:如果两个人同时投票,第二次投票将覆盖第一次投票的更改。要防止出现这种情况,请使用django.db.models import F
newlink.objects.filter(id=commentid).update(linklikesconter=F('linklikesconter')+1)
。这将在数据库级别的单个语句中更改计数器。嗯,我甚至没有注意到这一点。你能再进一步解释一下为什么会引入竞争条件吗?是不是因为调用LinkLikeCounter+=1行,然后将其保存到数据库所需的时间太长,而另一个人可能已经增加了该行的总和?谢谢你提醒我。是的,事情就是这样。假设柜台是10号。从数据库中获取对象并增加它,因此它是11。在保存之前,另一个人投票并获取计数器为10的“旧”对象。然后两者都以11的计数器保存对象,投票失败。啊,太棒了,谢谢。在编写原始代码时,我甚至没有想到这一点。是否有F功能的文档?是,请参阅。
if (request.POST.get('linklikebtn')):
        linkid = request.POST[‘linkset_likeid’] #retrieve the ID from the form
        url = newlink.objects.get(id=commentid) #get an instance of the desired url
        url.linklikescounter += 1 #increase the IntegerField by 1
        url.save() #save to the db