summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClaude Paroz <claude@2xlibre.net>2020-01-23 18:01:41 +0100
committerMariusz Felisiak <felisiak.mariusz@gmail.com>2020-01-27 08:54:32 +0100
commite348ab0d4382b0d7cb0cab9d1261c916c3d0ce6c (patch)
tree887f38c19afa9512965b36f276b7499fb54f8dad
parent7fa0fa45c5786619409036c5adce52ff6189b0ac (diff)
Fixed #30997 -- Deprecated HttpRequest.is_ajax().
-rw-r--r--django/http/request.py7
-rw-r--r--docs/internals/deprecation.txt2
-rw-r--r--docs/ref/request-response.txt2
-rw-r--r--docs/releases/1.4.txt2
-rw-r--r--docs/releases/3.1.txt7
-rw-r--r--tests/requests/test_is_ajax_deprecations.py12
6 files changed, 31 insertions, 1 deletions
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 <deprecated-features-3.1>` 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)