#35417: RequestContext.new creates a context that cannot be flattened
-------------------------------+--------------------------------------
     Reporter:  Lily Foote     |                    Owner:  nobody
         Type:  Uncategorized  |                   Status:  new
    Component:  Uncategorized  |                  Version:  5.0
     Severity:  Normal         |               Resolution:
     Keywords:                 |             Triage Stage:  Unreviewed
    Has patch:  0              |      Needs documentation:  0
  Needs tests:  0              |  Patch needs improvement:  0
Easy pickings:  0              |                    UI/UX:  0
-------------------------------+--------------------------------------
Description changed by Lily Foote:

Old description:

> In
> [https://github.com/django/django/blob/c187f5f9242b681abaa199173e02066997439425/django/template/library.py#L273
> InclusionNode.render] Django creates a {{{new_context}}} from two
> existing contexts ({{{context}}} and {{{_dict}}}) by calling
> {{{new_context = context.new(_dict)}}}. These can both be instances of
> {{{RequestContext}}} leading to {{{new_context}}} also being a
> {{{RequestContext}}} (I have not tried with any other context types).
> However, calling {{{new_context.flatten()}}} raises a {{{ValueError}}}:
>
> {{{
> ValueError: dictionary update sequence element #0 has length 1; 2 is
> required
> }}}
>
> I can reproduce this in a small test:
>
> {{{
> from django.template.context import RequestContext
> from django.test import RequestFactory, TestCase
>

> class RequestContextTestCase(TestCase):
>     def test_flatten_request_context_new(self):
>         factory = RequestFactory()
>
>         request = factory.get("/foo/")
>         context = RequestContext(request)
>         context_2 = RequestContext(request)
>         context_3 = context.new(context_2)
>
>         self.assertEqual(
>             context_3.flatten(), {"False": False, "None": None, "True":
> True}
>         )
> }}}
>
> I discovered this when running Kolo on a Django admin view
> (http://127.0.0.1:8000/admin/auth/user/). Kolo calls
> {{{context.flatten()}}} internally when introspecting a template during
> rendering, which leads to this exception:
>
> {{{
> Traceback (most recent call last):
>   File
> "/home/lily/work/kloppindustries/kolo/python/src/kolo/profiler.py", line
> 170, in __call__
>     frame_data = processor.process(
>                  ^^^^^^^^^^^^^^^^^^
>   File "/home/lily/work/kloppindustries/kolo/python/src/kolo/plugins.py",
> line 107, in process
>     data.update(self.process_extra(frame, event, arg, self.context))
>                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File
> "/home/lily/work/kloppindustries/kolo/python/src/kolo/filters/django.py",
> line 89, in process_django_template
>     template_context = template_context.flatten()
>                        ^^^^^^^^^^^^^^^^^^^^^^^^^^
>   File "/home/lily/.local/share/lilyenv/virtualenvs/kolo-
> sandbox/3.12/lib/python3.12/site-packages/django/template/context.py",
> line 120, in flatten
>     flat.update(d)
> ValueError: dictionary update sequence element #0 has length 3; 2 is
> required
> }}}

New description:

 In
 
[https://github.com/django/django/blob/c187f5f9242b681abaa199173e02066997439425/django/template/library.py#L273
 InclusionNode.render] Django creates a {{{new_context}}} from two existing
 contexts ({{{context}}} and {{{_dict}}}) by calling {{{new_context =
 context.new(_dict)}}}. These can both be instances of {{{RequestContext}}}
 leading to {{{new_context}}} also being a {{{RequestContext}}} (I have not
 tried with any other context types). However, calling
 {{{new_context.flatten()}}} raises a {{{ValueError}}}:

 {{{
 ValueError: dictionary update sequence element #0 has length 1; 2 is
 required
 }}}

 I can reproduce this in a small test:

 {{{
 from django.template.context import RequestContext
 from django.test import RequestFactory, TestCase


 class RequestContextTestCase(TestCase):
     def test_flatten_request_context_new(self):
         factory = RequestFactory()

         request = factory.get("/foo/")
         context = RequestContext(request)
         context_2 = RequestContext(request)
         context_3 = context.new(context_2)

         self.assertEqual(
             context_3.flatten(), {"False": False, "None": None, "True":
 True}
         )
 }}}

 I discovered this when running Kolo on a Django admin view
 (http://127.0.0.1:8000/admin/auth/user/). Kolo calls
 {{{context.flatten()}}} internally when introspecting a template during
 rendering, which leads to this exception:

 {{{
 Traceback (most recent call last):
   File "/home/lily/work/kloppindustries/kolo/python/src/kolo/profiler.py",
 line 170, in __call__
     frame_data = processor.process(
                  ^^^^^^^^^^^^^^^^^^
   File "/home/lily/work/kloppindustries/kolo/python/src/kolo/plugins.py",
 line 107, in process
     data.update(self.process_extra(frame, event, arg, self.context))
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   File
 "/home/lily/work/kloppindustries/kolo/python/src/kolo/filters/django.py",
 line 89, in process_django_template
     template_context = template_context.flatten()
                        ^^^^^^^^^^^^^^^^^^^^^^^^^^
   File "/home/lily/.local/share/lilyenv/virtualenvs/kolo-
 sandbox/3.12/lib/python3.12/site-packages/django/template/context.py",
 line 120, in flatten
     flat.update(d)
 ValueError: dictionary update sequence element #0 has length 3; 2 is
 required
 }}}

 This is similar to #24765 and #26041.

--
-- 
Ticket URL: <https://code.djangoproject.com/ticket/35417#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/0107018f2f8d686c-dbdfacf3-6386-4481-a08f-44cce46bfa82-000000%40eu-central-1.amazonses.com.

Reply via email to