From e348ab0d4382b0d7cb0cab9d1261c916c3d0ce6c Mon Sep 17 00:00:00 2001 From: Claude Paroz Date: Thu, 23 Jan 2020 18:01:41 +0100 Subject: [PATCH] Fixed #30997 -- Deprecated HttpRequest.is_ajax(). --- django/http/request.py | 7 +++++++ docs/internals/deprecation.txt | 2 ++ docs/ref/request-response.txt | 2 ++ docs/releases/1.4.txt | 2 +- docs/releases/3.1.txt | 7 +++++++ tests/requests/test_is_ajax_deprecations.py | 12 ++++++++++++ 6 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 tests/requests/test_is_ajax_deprecations.py diff --git a/django/http/request.py b/django/http/request.py index 790e4546d7..192ade4de6 100644 --- a/django/http/request.py +++ b/django/http/request.py @@ -1,6 +1,7 @@ import cgi import codecs import copy +import warnings from io import BytesIO from itertools import chain from urllib.parse import quote, urlencode, urljoin, urlsplit @@ -15,6 +16,7 @@ from django.http.multipartparser import MultiPartParser, MultiPartParserError from django.utils.datastructures import ( CaseInsensitiveMapping, ImmutableList, MultiValueDict, ) +from django.utils.deprecation import RemovedInDjango40Warning from django.utils.encoding import escape_uri_path, iri_to_uri from django.utils.functional import cached_property from django.utils.http import is_same_domain, limited_parse_qsl @@ -256,6 +258,11 @@ class HttpRequest: return self.scheme == 'https' def is_ajax(self): + warnings.warn( + 'request.is_ajax() is deprecated. See Django 3.1 release notes ' + 'for more details about this deprecation.', + RemovedInDjango40Warning, + ) return self.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest' @property diff --git a/docs/internals/deprecation.txt b/docs/internals/deprecation.txt index 9aa90f32a9..dc6923d488 100644 --- a/docs/internals/deprecation.txt +++ b/docs/internals/deprecation.txt @@ -44,6 +44,8 @@ details on these changes. * The ``django-admin.py`` entry point will be removed. +* The ``HttpRequest.is_ajax()`` method will be removed. + See the :ref:`Django 3.1 release notes ` for more details on these changes. diff --git a/docs/ref/request-response.txt b/docs/ref/request-response.txt index 2f9e78e358..95994ee41e 100644 --- a/docs/ref/request-response.txt +++ b/docs/ref/request-response.txt @@ -431,6 +431,8 @@ Methods .. method:: HttpRequest.is_ajax() + .. deprecated:: 3.1 + Returns ``True`` if the request was made via an ``XMLHttpRequest``, by checking the ``HTTP_X_REQUESTED_WITH`` header for the string ``'XMLHttpRequest'``. Most modern JavaScript libraries send this header. diff --git a/docs/releases/1.4.txt b/docs/releases/1.4.txt index ccee3df153..12a593c372 100644 --- a/docs/releases/1.4.txt +++ b/docs/releases/1.4.txt @@ -609,7 +609,7 @@ Django 1.4 also includes several smaller improvements worth noting: * A new, plain-text, version of the HTTP 500 status code internal error page served when :setting:`DEBUG` is ``True`` is now sent to the client when Django detects that the request has originated in JavaScript code. - (:meth:`~django.http.HttpRequest.is_ajax` is used for this.) + (``is_ajax()`` is used for this.) Like its HTML counterpart, it contains a collection of different pieces of information about the state of the application. diff --git a/docs/releases/3.1.txt b/docs/releases/3.1.txt index 09b0b24eec..185292bd1b 100644 --- a/docs/releases/3.1.txt +++ b/docs/releases/3.1.txt @@ -471,6 +471,13 @@ Miscellaneous * The ``django-admin.py`` entry point is deprecated in favor of ``django-admin``. +* The ``HttpRequest.is_ajax()`` method is deprecated as it relied on a + jQuery-specific way of signifying AJAX calls, while the current usage tends + to use the ``fetch()`` JavaScript API. Depending on your use case, you can + either write your own AJAX detection method, or use the new + :meth:`.HttpRequest.accepts` method if your code depends on the client + ``Accept`` HTTP header. + .. _removed-features-3.1: Features removed in 3.1 diff --git a/tests/requests/test_is_ajax_deprecations.py b/tests/requests/test_is_ajax_deprecations.py new file mode 100644 index 0000000000..e311752d7f --- /dev/null +++ b/tests/requests/test_is_ajax_deprecations.py @@ -0,0 +1,12 @@ +from django.http import HttpRequest +from django.test import SimpleTestCase, ignore_warnings +from django.utils.deprecation import RemovedInDjango40Warning + + +@ignore_warnings(category=RemovedInDjango40Warning) +class TestDeprecatedIsAjax(SimpleTestCase): + def test_is_ajax(self): + request = HttpRequest() + self.assertIs(request.is_ajax(), False) + request.META['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest' + self.assertIs(request.is_ajax(), True)