diff --git a/rest_framework/fields.py b/rest_framework/fields.py index 9eb2a50a8b..0a151e7b4c 100644 --- a/rest_framework/fields.py +++ b/rest_framework/fields.py @@ -4,6 +4,7 @@ import decimal import functools import inspect +import math import re import uuid import warnings @@ -973,12 +974,17 @@ def to_internal_value(self, data): self.fail('max_string_length') try: - return float(data) + value = float(data) except (TypeError, ValueError): self.fail('invalid') except OverflowError: self.fail('overflow') + if not math.isfinite(value): + self.fail('invalid') + + return value + def to_representation(self, value): return float(value) diff --git a/tests/test_fields.py b/tests/test_fields.py index 869219a588..47d44e77ae 100644 --- a/tests/test_fields.py +++ b/tests/test_fields.py @@ -1243,7 +1243,13 @@ class TestFloatField(FieldValues): 0.0: 0.0, } invalid_inputs = { - 'abc': ["A valid number is required."] + 'abc': ["A valid number is required."], + 'nan': ["A valid number is required."], + 'inf': ["A valid number is required."], + '-inf': ["A valid number is required."], + '1e400': ["A valid number is required."], + float('nan'): ["A valid number is required."], + float('inf'): ["A valid number is required."], } outputs = { '1': 1.0,