昨天是一个富有成效的一天:这个项目的发展很大,在他们的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并考虑我的创作。