当前位置:   article > 正文

为django-rest-framework的Password Validator自定义HTTP状态码_django自定义状态码

django自定义状态码

背景:

在开发的时候,安卓前端表示拆包会很麻烦,最好是有http状态码,而不是在包里提供错误信息。而django password validator报错时默认的http状态码都是400,错误信息都是在包里提示的。

解决方案:

根据文档,发现rest framework可以通过APIView自定义报错,于是我编写了如下的代码:

  1. from rest_framework.exceptions import APIException
  2. class MinimumLengthError(APIException):
  3. status_code = 401
  4. default_detail = '密码长度太短,至少8位!'
  5. default_code = 'minimum_length_error'
  6. class UserAttributeSimilarityError(APIException):
  7. status_code = 402
  8. default_detail = '密码和用户信息重复度太高!'
  9. default_code = 'user_attribute_similarity_error'
  10. class CommonPassworError(APIException):
  11. status_code = 403
  12. default_detail = '密码太常见!'
  13. default_code = 'common_password_error'
  14. class NumericPasswordError(APIException):
  15. status_code = 404
  16. default_detail = '密码不能是纯数字的!'
  17. default_code = 'numeric_password_error'
  18. class PasswordResetTokenError(APIException):
  19. status_code= 405
  20. default_detail = 'Token错误'
  21. default_code = 'password_reset_token_error'

其中APIException时可以自定义的报错。其参数status code就是我们想要的http状态码。

接着我们修改django的password validator。将每一个validator的报错替换为我们新修改的异常。

  1. # 修改后
  2. class NumericPasswordValidator:
  3. """
  4. Validate whether the password is alphanumeric.
  5. """
  6. def validate(self, password, user=None):
  7. if password.isdigit():
  8. # 在这里修改
  9. raise errors.NumericPasswordError
  10. def get_help_text(self):
  11. return _("Your password can't be entirely numeric.")

这样我们就有可以反馈自定义状态码的password validator了。

接着我们可以将django默认的validator修改为我们自己定义的validator,这个可以在settings里设置。这方面教程很多,就不详细展开了。

另一种方式是,为了在用DRF(Django Rest Framework)的同时可以让MTV模式也可以像原来一样报错,有错误提示,我们可以修改django的validators.py这个文件。

首先我们复制一份到项目里,然后修改validate_password函数:

  1. def validate_password(password, user=None, password_validators=None):
  2. """
  3. Validate whether the password meets all validator requirements.
  4. If the password is valid, return ``None``.
  5. If the password is invalid, raise ValidationError with all error messages.
  6. """
  7. if password_validators is None:
  8. password_validators = get_default_password_validators()
  9. for validator in password_validators:
  10. try:
  11. validator.validate(password, user)
  12. except APIException as error:
  13. raise error

这样就会只报一个异常,而不是像原来那样报很多error。

接着需要修改初始化validator的函数:

  1. @functools.lru_cache(maxsize=None)
  2. def get_default_password_validators():
  3. return get_password_validators(settings.REST_PASSWORD_VALIDATORS)
  4. # settings里的REST_PASSWORD_VALIDATORS是我们自己建的validator

这样,我们就大功告成了。

之后在authenticate的时候我们就可以用自己的validators.py里面的validate_password函数。

(新人第一次写博客,请多多包涵)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/979513
推荐阅读
相关标签
  

闽ICP备14008679号