Python日记| #14。选择颜色:生产性一天
#spanish #python #django #开发日志

昨天是一个富有成效的一天:这个项目的发展很大,在他们的repositorio de GitHub中,已经应用了多种想法。

今天,我们将讨论身份验证,自动生成伪造信息等等。调整皮带,因为东西很强!

验证是否已经投票

已经具有用户可以投票的功能,必须验证下一个功能。想到要建立不同的终点,因为这个想法是在产生边界时,我可以在产生投票本身之前先咨询。

@api_view(['GET'])
@permission_classes([permissions.IsAuthenticated])
def is_voted(request):
    vote = Vote.objects.filter(user=request.user).first()

    if vote is None:
        return Response({
            "is_voted": False,
            "message": f"{request.user} no ha votado.",
        })
    else:
        return Response({
            "is_voted": True,
            "message": f"{request.user} ya ha votado el color {vote.color}.",
        })

由于我不在视图集中,因此我必须应用 permision_classes 装饰器。他认为获得最合适的是,因为我们正在获得国家的信息。

然后我做了一生的路线:

path('votes/voted', is_voted, name='api-votes-voted'),

关键验证器停用

许多在Django经历的开发人员会讨厌我,我事先向我道歉。暂时停用验证器,因为很难一直用安全的钥匙生成用户:

AUTH_PASSWORD_VALIDATORS = [
    # {
    #     'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    # },
    # {
    #     'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    # },
    # {
    #     'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    # },
    # {
    #     'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    # },
]

反过来,我会了解到我可以将这些价值定义为自己的喜好,甚至可以在我愿意的情况下应用您的值。将来我一定会利用优势ð。

修复de id en colorializer

当我想添加白色时,我很惊讶收到错误:

{
    "name": "blanco",
    "hexa": "#FFF"
}

我要求 id ³字。是的,是在我们的BD中自动生成的。幸运的是,logré resolverlo在此序列化合器字段中与A ReadOnly = true roph。

我不触摸端点颜色

然后,我意识到端点颜色可以访问任何人,消除,添加和修改您的喜好。这需要进行修改,但不能限制所有内容,因为普通用户必须列出颜色才能在正面看到它们并投票。

def get_permissions(self):
    if self.action == 'list':
        permission_classes = [permissions.AllowAny]
    else:
        permission_classes = [permissions.IsAdminUser]
    return [permission() for permission in permission_classes]

请记住,“列表”是返回所有记录的 get api/colors

懒惰,很多

我们的基本美德之一是la pereza。这使我思考:

我必须生成用户和颜色才能测试... uf。
这不仅是大量的工作,而且非常无聊。那把我带到了所有开发人员都喜欢的解决方案:自动化事物。

假用户

事实证明,python中有一个库(感谢chatgpt),它使我们能够生成伪造的用户(摘要,错误的用户,坏人)。这不仅仅是一组随机字符串,而是信息的连贯性,名称,姓氏或电子邮件。

因此,我决定创建一个 utls impaulus和包含 face_users function :


的python脚本

def fake_users(num_users):
    fake = Faker()
    user_list = []
    for i in range(num_users):
        username = fake.user_name()
        email = fake.email()
        password = fake.password()
        first_name = fake.first_name()
        last_name = fake.last_name()
        user = User.objects.create_user(username=username, email=email, password=password, first_name=first_name, last_name=last_name)
        user.save()
        user_list.append(user)

    return user_list

我最初的想法是将其作为一个松散的脚本执行,但是Django的常数是一个问题。因此,我决定不离开范围并生成一个终点,当然只有管理员的许可证:

def generate_fake_users(request, amount):
    user_list = fake_users(amount)
    user_serializer_list = [UserSerializer(user).data for user in user_list]

    return Response({"users": user_serializer_list})

一个有趣的细节,我通过符号传递了数量(数量),因此我可以生成每个想要的人。我还通过Usererializer将其传递给了。

假票

我手工制作了颜色,我可以自动化它,但我想控制这些颜色。除了名称和值十六进制之间应该存在连贯的关系。

另一方面,投票是另一个话题:如果我手工做的话,将每个用户的投票授予我花费数小时,所以我发明了假票:

def fake_votes(num_votes):
    vote_list = []
    colors = Color.objects.all()
    users = User.objects.all()

    while len(vote_list) < num_votes:
        random_color = choice(colors)
        random_user = choice(users)

        old_vote = Vote.objects.filter(user=random_user).first()
        if old_vote is None:
            vote = Vote.objects.create(user=random_user, color=random_color)
            vote.save()
            vote_list.append(vote)

    return vote_list

我还带给我所有的颜色和用户,然后使用A 选择功能我选择随机值。

进入一段时间,因为它需要持续到票数实现为止。这是因为 randy_user 可以选择已经投票的用户,这将无法保存,因为它是重复的入口。

防止它爆炸(作为您的财务ð×),如果有投票(old_vote),并且没有生成新的。简单的半fun libic。

观点是通常的,但是投票:

@api_view(['POST'])
@permission_classes([permissions.IsAdminUser])
def generate_fake_votes(request, amount):
    vote_list = fake_votes(amount)
    vote_serializer_list = [VoteSerializer(vote).data for vote in vote_list]

    return Response({"votes": vote_serializer_list})

拉斯·埃斯塔德斯卡斯

现在,用户和投票已经自动化了,它可以生成我想要的尽可能多的记录。这使我获得了50或60票的投票,并且有很多舞台。

所以我开始构建所有内容,以展示会有多少票

@api_view(['GET'])
def votes_stats(request):
    votes_by_color = Vote.objects.values('color__name').annotate(count=Count('id'))
    result = {}
    for vote in votes_by_color:
        result[vote['color__name']] = vote['count']
    return Response(result)
notate(count = count ='id'))

然后,我们以颜色名称的键汇总了一个字典,并以其数量为单位。为了说明结果,请查看我的JSON:

{
    "amarillo": 4,
    "azul": 1,
    "blanco": 2,
    "negro": 4,
    "rojo": 2,
    "rosa": 3,
    "verde": 4,
    "violeta": 1
}

这个简单词典的潜力是无限的:谷物,甚至散射,甚至分散。

结论

我认为,尽管将来可能会出现新的变化,但是我已经有一个APISólida来占据边境并建立一个利用这些功能的站点,应用程序或某些桌面接口。我们将看到我可以在以后的文章中带给我的东西,因为现在我将准备一个gin tonic并考虑我的创作。