mirror of
https://github.com/django/django.git
synced 2024-12-22 17:16:24 +00:00
This reverts commit 6220c445c4
.
Thanks Adam Johnson and Márton Salomváry for reports.
This commit is contained in:
parent
dfc720c521
commit
280ca147af
@ -54,9 +54,6 @@ class LimitedStream(IOBase):
|
|||||||
|
|
||||||
|
|
||||||
class WSGIRequest(HttpRequest):
|
class WSGIRequest(HttpRequest):
|
||||||
non_picklable_attrs = HttpRequest.non_picklable_attrs | frozenset(["environ"])
|
|
||||||
meta_non_picklable_attrs = frozenset(["wsgi.errors", "wsgi.input"])
|
|
||||||
|
|
||||||
def __init__(self, environ):
|
def __init__(self, environ):
|
||||||
script_name = get_script_name(environ)
|
script_name = get_script_name(environ)
|
||||||
# If PATH_INFO is empty (e.g. accessing the SCRIPT_NAME URL without a
|
# If PATH_INFO is empty (e.g. accessing the SCRIPT_NAME URL without a
|
||||||
@ -82,13 +79,6 @@ class WSGIRequest(HttpRequest):
|
|||||||
self._read_started = False
|
self._read_started = False
|
||||||
self.resolver_match = None
|
self.resolver_match = None
|
||||||
|
|
||||||
def __getstate__(self):
|
|
||||||
state = super().__getstate__()
|
|
||||||
for attr in self.meta_non_picklable_attrs:
|
|
||||||
if attr in state["META"]:
|
|
||||||
del state["META"][attr]
|
|
||||||
return state
|
|
||||||
|
|
||||||
def _get_scheme(self):
|
def _get_scheme(self):
|
||||||
return self.environ.get("wsgi.url_scheme")
|
return self.environ.get("wsgi.url_scheme")
|
||||||
|
|
||||||
|
@ -55,8 +55,6 @@ class HttpRequest:
|
|||||||
_encoding = None
|
_encoding = None
|
||||||
_upload_handlers = []
|
_upload_handlers = []
|
||||||
|
|
||||||
non_picklable_attrs = frozenset(["resolver_match", "_stream"])
|
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
# WARNING: The `WSGIRequest` subclass doesn't call `super`.
|
# WARNING: The `WSGIRequest` subclass doesn't call `super`.
|
||||||
# Any variable assignment made here should also happen in
|
# Any variable assignment made here should also happen in
|
||||||
@ -84,21 +82,6 @@ class HttpRequest:
|
|||||||
self.get_full_path(),
|
self.get_full_path(),
|
||||||
)
|
)
|
||||||
|
|
||||||
def __getstate__(self):
|
|
||||||
obj_dict = self.__dict__.copy()
|
|
||||||
for attr in self.non_picklable_attrs:
|
|
||||||
if attr in obj_dict:
|
|
||||||
del obj_dict[attr]
|
|
||||||
return obj_dict
|
|
||||||
|
|
||||||
def __deepcopy__(self, memo):
|
|
||||||
obj = copy.copy(self)
|
|
||||||
for attr in self.non_picklable_attrs:
|
|
||||||
if hasattr(self, attr):
|
|
||||||
setattr(obj, attr, copy.deepcopy(getattr(self, attr), memo))
|
|
||||||
memo[id(self)] = obj
|
|
||||||
return obj
|
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def headers(self):
|
def headers(self):
|
||||||
return HttpHeaders(self.META)
|
return HttpHeaders(self.META)
|
||||||
|
@ -373,10 +373,12 @@ class HttpResponse(HttpResponseBase):
|
|||||||
[
|
[
|
||||||
"resolver_match",
|
"resolver_match",
|
||||||
# Non-picklable attributes added by test clients.
|
# Non-picklable attributes added by test clients.
|
||||||
|
"asgi_request",
|
||||||
"client",
|
"client",
|
||||||
"context",
|
"context",
|
||||||
"json",
|
"json",
|
||||||
"templates",
|
"templates",
|
||||||
|
"wsgi_request",
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -29,3 +29,7 @@ Bugfixes
|
|||||||
* Fixed a regression in Django 4.2 where ``i18n_patterns()`` didn't respect the
|
* Fixed a regression in Django 4.2 where ``i18n_patterns()`` didn't respect the
|
||||||
``prefix_default_language`` argument when a fallback language of the default
|
``prefix_default_language`` argument when a fallback language of the default
|
||||||
language was used (:ticket:`34455`).
|
language was used (:ticket:`34455`).
|
||||||
|
|
||||||
|
* Fixed a regression in Django 4.2 where creating copies and deep copies of
|
||||||
|
``HttpRequest`` and its subclasses didn't always work correctly
|
||||||
|
(:ticket:`34482`, :ticket:`34484`).
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import pickle
|
import copy
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from itertools import chain
|
from itertools import chain
|
||||||
from urllib.parse import urlencode
|
from urllib.parse import urlencode
|
||||||
@ -233,6 +233,11 @@ class RequestsTests(SimpleTestCase):
|
|||||||
# left percent-encoded in the path.
|
# left percent-encoded in the path.
|
||||||
self.assertEqual(request.path, "/caf%E9/")
|
self.assertEqual(request.path, "/caf%E9/")
|
||||||
|
|
||||||
|
def test_wsgirequest_copy(self):
|
||||||
|
request = WSGIRequest({"REQUEST_METHOD": "get", "wsgi.input": BytesIO(b"")})
|
||||||
|
request_copy = copy.copy(request)
|
||||||
|
self.assertIs(request_copy.environ, request.environ)
|
||||||
|
|
||||||
def test_limited_stream(self):
|
def test_limited_stream(self):
|
||||||
# Read all of a limited stream
|
# Read all of a limited stream
|
||||||
stream = LimitedStream(BytesIO(b"test"), 2)
|
stream = LimitedStream(BytesIO(b"test"), 2)
|
||||||
@ -687,19 +692,17 @@ class RequestsTests(SimpleTestCase):
|
|||||||
with self.assertRaises(UnreadablePostError):
|
with self.assertRaises(UnreadablePostError):
|
||||||
request.FILES
|
request.FILES
|
||||||
|
|
||||||
def test_pickling_request(self):
|
def test_copy(self):
|
||||||
request = HttpRequest()
|
request = HttpRequest()
|
||||||
request.method = "GET"
|
request_copy = copy.copy(request)
|
||||||
request.path = "/testpath/"
|
self.assertIs(request_copy.resolver_match, request.resolver_match)
|
||||||
request.META = {
|
|
||||||
"QUERY_STRING": ";some=query&+query=string",
|
def test_deepcopy(self):
|
||||||
"SERVER_NAME": "example.com",
|
request = RequestFactory().get("/")
|
||||||
"SERVER_PORT": 80,
|
request.session = {}
|
||||||
}
|
request_copy = copy.deepcopy(request)
|
||||||
request.COOKIES = {"post-key": "post-value"}
|
request.session["key"] = "value"
|
||||||
dump = pickle.dumps(request)
|
self.assertEqual(request_copy.session, {})
|
||||||
request_from_pickle = pickle.loads(dump)
|
|
||||||
self.assertEqual(repr(request), repr(request_from_pickle))
|
|
||||||
|
|
||||||
|
|
||||||
class HostValidationTests(SimpleTestCase):
|
class HostValidationTests(SimpleTestCase):
|
||||||
|
Loading…
Reference in New Issue
Block a user