【问题标题】:validate and handle error to pass meaningful status back to client验证并处理错误以将有意义的状态传递回客户端
【发布时间】:2019-07-25 15:41:02
【问题描述】:

我正在使用graphene-django 而不是rest api(rest 框架)。我正在处理用户注册。在其余框架中,验证是在序列化程序部分完成的,但是当使用graphene 时,我如何验证和处理错误以将有意义的状态传递给客户端?

这是注册码

class Register(graphene.Mutation):
    class Arguments:
        email = graphene.String(required=True)
        password = graphene.String(required=True)
        password_repeat = graphene.String(required=True)

    user = graphene.Field(UserQuery)
    success = graphene.Boolean()
    errors = graphene.List(graphene.String)

    @staticmethod
    def mutate(self, info, email, password, password_repeat):
        if password == password_repeat:
            try:
                user = User.objects.create(email=email)
                user.set_password(password)
                user.is_active = False
                user.full_clean()
                user.save()
                return Register(success=True, user=user)
            except ValidationError as e:
                import pdb
                pdb.set_trace()
                return Register(success=False, errors=[e])
        return Register(success=False, errors=['password', 'password is not matching'])

一个例子可以是验证用户是否已经存在电子邮件

【问题讨论】:

    标签: python django graphene-python graphene-django


    【解决方案1】:

    最简单的方法如下:

        @staticmethod
        def mutate(root, info, email, password, password_repeat):
            errors = []
            if password == password_repeat:
                errors.append('password_is_not_matching')
    
            if User.objects.filter(email=email).exists():
                errors.append('email_is_already_registred')
    
            if len(errors) == 0:
                try:
                    user = User.objects.create(email=email)
                    user.set_password(password)
                    user.is_active = False
                    user.full_clean()
                    user.save()
                    return Register(success=True, user=user)
                except ValidationError as e:
                    import pdb
                    pdb.set_trace()
                    return Register(success=False, errors=[e])
            return Register(success=False, errors=errors)
    

    但如果您进行大量此类检查,可能会出现问题 - 代码变得更加复杂,并且更难弄清楚突变的实际作用。

    更多信息请阅读this article

    【讨论】:

    • "但是如果您进行大量此类检查,可能会出现问题-"。推荐的解决方案是什么?我没有找到太多与石墨烯相关的验证资源,因此我认为最好的解决方案也可能对许多其他开发人员有所帮助。
    • 这是一个长篇大论,所以这里有一个链接到关于那篇文章的链接medium.com/@don.skoy.333/…
    • 百万感谢 这肯定会帮助遇到此类问题的每个人。
    猜你喜欢
    • 2012-08-17
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多