项目作者: llybin

项目描述 :
Django REST framework reCAPTCHA
高级语言: Python
项目地址: git://github.com/llybin/drf-recaptcha.git
创建时间: 2019-12-03T17:57:00Z
项目社区:https://github.com/llybin/drf-recaptcha

开源协议:MIT License

下载


Django REST reCAPTCHA

Django REST reCAPTCHA v2 and v3 field serializer

Donate
CI
Codacy Badge
Codacy Badge
Ruff
PyPI
PyPI - Downloads
PyPI - License

Requirements

  • Python: 3.10, 3.11, 3.12
  • Django: 4.2, 5.0, 5.1
  • DRF: 3.14, 3.15

Installation

  1. Sign up for reCAPTCHA
  2. Install with pip install drf-recaptcha
  3. Add "drf_recaptcha" to your INSTALLED_APPS settings.
  4. Set in settings DRF_RECAPTCHA_SECRET_KEY
  1. INSTALLED_APPS = [
  2. ...,
  3. "drf_recaptcha",
  4. ...,
  5. ]
  6. ...
  7. DRF_RECAPTCHA_SECRET_KEY = "YOUR SECRET KEY"

Usage

  1. from rest_framework.serializers import Serializer, ModelSerializer
  2. from drf_recaptcha.fields import ReCaptchaV2Field, ReCaptchaV3Field
  3. from feedback.models import Feedback
  4. class V2Serializer(Serializer):
  5. recaptcha = ReCaptchaV2Field()
  6. ...
  7. class GetOTPView(APIView):
  8. def post(self, request):
  9. serializer = V2Serializer(data=request.data, context={"request": request})
  10. serializer.is_valid(raise_exception=True)
  11. ...
  12. class V3Serializer(Serializer):
  13. recaptcha = ReCaptchaV3Field(action="example")
  14. ...
  15. class V3WithScoreSerializer(Serializer):
  16. recaptcha = ReCaptchaV3Field(
  17. action="example",
  18. required_score=0.6,
  19. )
  20. ...
  21. class GetReCaptchaScore(APIView):
  22. def post(self, request):
  23. serializer = V3WithScoreSerializer(data=request.data, context={"request": request})
  24. serializer.is_valid()
  25. score = serializer.fields['recaptcha'].score
  26. ...
  27. class FeedbackSerializer(ModelSerializer):
  28. recaptcha = ReCaptchaV2Field()
  29. class Meta:
  30. model = Feedback
  31. fields = ("phone", "full_name", "email", "comment", "recaptcha")
  32. def validate(self, attrs):
  33. attrs.pop("recaptcha")
  34. ...
  35. return attrs
  36. class DynamicContextSecretKey(APIView):
  37. def post(self, request):
  38. if request.platform == "android":
  39. recaptcha_secret_key = "SPECIAL_FOR_ANDROID"
  40. else:
  41. recaptcha_secret_key = "SPECIAL_FOR_IOS"
  42. serializer = WithReCaptchaSerializer(
  43. data=request.data,
  44. context={
  45. "request": request,
  46. "recaptcha_secret_key": recaptcha_secret_key,
  47. },
  48. )
  49. serializer.is_valid(raise_exception=True)
  50. ...
  51. class DynamicContextSecretKey(GenericAPIView):
  52. serializer_class = WithReCaptchaSerializer
  53. def get_serializer_context(self):
  54. if self.request.platform == "android":
  55. recaptcha_secret_key = "SPECIAL_FOR_ANDROID"
  56. else:
  57. recaptcha_secret_key = "SPECIAL_FOR_IOS"
  58. context = super().get_serializer_context()
  59. context.update({"recaptcha_secret_key": recaptcha_secret_key})
  60. return context
  61. class MobileSerializer(Serializer):
  62. recaptcha = ReCaptchaV3Field(secret_key="SPECIAL_MOBILE_KEY", action="feedback")
  63. ...

Settings

DRF_RECAPTCHA_SECRET_KEY - set your Google reCAPTCHA secret key. Type: str.

DRF_RECAPTCHA_DEFAULT_V3_SCORE - by default: 0.5. Type: float.

DRF_RECAPTCHA_ACTION_V3_SCORES - by default: {}. Type: dict. You can define specific score for each action e.g.
{"login": 0.6, "feedback": 0.3}

DRF_RECAPTCHA_DOMAIN - by default: www.google.com. Type: str.

DRF_RECAPTCHA_PROXY - by default: {}. Type: dict. e.g.
{'http': 'http://127.0.0.1:8000', 'https': 'https://127.0.0.1:8000'}

DRF_RECAPTCHA_VERIFY_REQUEST_TIMEOUT - by default: 10. Type: int.

Priority of secret_key value

  1. settings DRF_RECAPTCHA_SECRET_KEY
  2. the argument secret_key of field
  3. request.context[“recaptcha_secret_key”]

Silence the check error

If you need to disable the error, you can do so using the django settings.

  1. SILENCED_SYSTEM_CHECKS = ['drf_recaptcha.checks.recaptcha_system_check']

reCAPTCHA v3

Validation is passed if the score value returned by Google is greater than or equal to required score.

Required score value: 0.0 - 1.0

Priority of score value

If not defined or zero in current item then value from next item.

  1. Value for action in settings DRF_RECAPTCHA_ACTION_V3_SCORES
  2. Value in argument required_score of field
  3. Default value in settings DRF_RECAPTCHA_DEFAULT_V3_SCORE
  4. Default value 0.5

Testing

Set DRF_RECAPTCHA_TESTING=True in settings, no request to Google, no warnings, DRF_RECAPTCHA_SECRET_KEY is not
required, set returning verification result in setting below.

DRF_RECAPTCHA_TESTING_PASS=True|False - all responses are pass, default True.

Use from django.test import override_settings

Credits

django-recaptcha

reCAPTCHA copyright 2012 Google.