Skip to main content
 首页 » 编程设计

python之如何检测用户是否再次尝试投票

2025年05月04日12arxive

我目前正在实现一个投票系统(应用程序中不会使用否决系统)。我设法在我的应用程序中为 Post 模型创建了一个 upvote 属性。该属性的默认值为 0,如下所示:

模型.py

class User(UserMixin, Model): 
    username = CharField(unique= True) 
    email = CharField(unique= True) 
    password = CharField(max_length = 100) 
    joined_at = DateTimeField(default = datetime.datetime.now) 
    is_admin = BooleanField(default = False) 
    confirmed = BooleanField(default = False) 
    confirmed_on = DateTimeField(null=True) 
 
    class Meta: 
        database = DATABASE 
        order_by = ('-joined_at',) 
 
    def get_posts(self): 
        return Post.select().where(Post.user == self) 
 
    def get_stream(self): 
        return Post.select().where( 
            (Post.user == self) 
        ) 
 
    @classmethod 
    def create_user(cls, username, email, password, is_admin= False, confirmed = False, confirmed_on = None): 
        try: 
            with DATABASE.transaction(): 
                cls.create( 
                username = username, 
                email = email, 
                password = generate_password_hash(password), 
                is_admin = is_admin, 
                confirmed = confirmed, 
                confirmed_on = confirmed_on) 
        except IntegrityError: 
            raise ValueError("User already exists") 
 
class Post(Model): 
    timestamp = DateTimeField(default=datetime.datetime.now) 
    user = ForeignKeyField( 
        rel_model = User, 
        related_name = 'posts' 
    ) 
    name = TextField() 
    content = TextField() 
    upvotes = IntegerField(default=0) 
    url = TextField() 
    category = TextField() 
 
    class Meta: 
        database = DATABASE 
        order_by = ('-timestamp',) 

我设法通过让用户点击链接来增加值(value):

stream.html

 <div class="voting_bar"> 
        <a href="/vote/{{post.id}}"><img src="/static/img/upvote.png"></a> 
        <p>{{post.upvotes}}</p> 
      </div> 

这将激活具有关联路由的功能:

app.py

@app.route('/vote/<int:post_id>') 
def upvote(post_id): 
    posts = models.Post.select().where(models.Post.id == post_id) 
    if posts.count() == 0: 
        abort(404) 
    post = models.Post.select().where(models.Post.id == post_id).get() 
    query = models.Post.update(upvotes = (post.upvotes+1)).where(models.Post.id == post_id) 
    query.execute() 
    return redirect(url_for('index')) 

我的问题是,如何检测用户是否已经投票?我不确定我应该怎么做才能做到这一点。我的计划是,如果我确定用户是否试图再次投票,我会做的只是减少他们之前的投票。

请您参考如下方法:

我认为这里最好的方法是创建一个名为 Votes 的单独表,该表将包含两列。一个将存储帖子的 ID,另一个将存储用户的 ID。表中的每个条目或行都算作一票。如果用户尝试对特定帖子投票,您将首先查询 Votes 表是否存在具有该用户 ID 的行。如果不存在,则添加投票。但是,如果它确实存在,那么您只需删除投票即可。要获得特定帖子的总票数,您将再次查询 Votes 表并计算具有给定帖子 ID 的行数。这也将使您的应用程序具有可扩展性,以防万一您希望在将来添加反对票功能。