Skip to content

docs: document the Litestar, Flask and Celery integration fixes - #684

Merged
lesnik512 merged 3 commits into
mainfrom
docs/litestar-flask-follow-ups
Oct 17, 2026
Merged

lesnik512 merged 3 commits into
mainfrom
docs/litestar-flask-follow-ups

Conversation

@lesnik512

@lesnik512 lesnik512 commented Oct 17, 2026 •

Copy link
Copy Markdown
Member

Follow-up notes for three integration fixes, now released.

Litestar (modern-python/modern-di-litestar#75, released in modern-di-litestar 4.0.1): the di_container warning in "Auto-wiring with autowired_groups" says the name is reserved for the plugin's own dependency. Since 4.0.1, an autowired group that declares a provider under that name raises litestar.exceptions.ImproperlyConfiguredException when the app is created; earlier releases never finish building the app. The page used to say Litestar fails with RecursionError.

Flask (modern-python/modern-di-flask#40, released in modern-di-flask 4.1.0):

  • The intro said views must be sync. It now says views can be sync or async def, and resolution is sync for both.
  • A new "Async views" subsection covers @inject and auto_inject=True on async def views since 4.1.0, the flask[async] extra, and that teardown is still close_sync(), so REQUEST-scoped async finalizers are unsupported. Its example builds its own app and a hidden block requests the view, so just test-docs-integrations checks it against the PyPI release. flask[async] is added to docs_integration_extras in the justfile for that.
  • "Scopes and lifecycle" says to close the root with asyncio.run(fetch_di_container(app).close_async()) when an APP-scoped provider has an async finalizer.
  • The inject row in the API table covers async views.

Celery (modern-python/modern-di-celery#42, released in modern-di-celery 4.0.1):

  • The warning "The prefork pool fails on macOS" was wrong: Celery starts prefork children with fork on Linux and macOS. It is replaced by a note on the spawn start method (Windows, or forced), which needs FORKED_BY_MULTIPROCESSING=1, and says that since 4.0.1 a spawn child gets its container matched to the app by main name.
  • setup_di no longer stores the container on app.conf; the usage paragraph and the API table say it registers the container for the app.

Checks run locally: just docs-build, just test-docs, just test-docs-integrations (339 passed, 1 skipped), and the offline lychee link check.

@github-actions github-actions Bot left a comment •

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Benchmark

Details
Benchmark suite Current: b195c85 Previous: 8d8784f Ratio
benchmarks/test_guard_by_type.py::test_g16_resolve_by_type 3676824.888151354 iter/sec (stddev: 9.239423678742086e-9) 3336604.429074763 iter/sec (stddev: 1.146221988734387e-8) 0.91
benchmarks/test_guard_by_type.py::test_g17_resolve_by_type_large_registry 3321001.2380431923 iter/sec (stddev: 1.034552573333977e-8) 3290245.7014236413 iter/sec (stddev: 1.154331993429836e-8) 0.99
benchmarks/test_guard_cold.py::test_g8_cold_first_resolve 20905.05835287806 iter/sec (stddev: 0.000047392441258276855) 20798.838862701752 iter/sec (stddev: 0.00004656949506912769) 0.99
benchmarks/test_guard_cold.py::test_g8b_cold_first_resolve_cached 16626.934508146624 iter/sec (stddev: 0.00012913652679374024) 17186.247018817543 iter/sec (stddev: 0.00012087242592414054) 1.03
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[1] 478.4015017090282 iter/sec (stddev: 0.000035407188417346275) 475.4148431515588 iter/sec (stddev: 0.000055845095928237784) 0.99
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[2] 469.1881023745424 iter/sec (stddev: 0.000043798322234672806) 465.9649487974885 iter/sec (stddev: 0.00005783407147297572) 0.99
benchmarks/test_guard_concurrency.py::test_g14_concurrent_cached_hit[4] 439.38556868776203 iter/sec (stddev: 0.00008088176453090706) 408.7046944845833 iter/sec (stddev: 0.0001464753349141738) 0.93
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[1] 13419.866121160027 iter/sec (stddev: 0.000008286528917629516) 12273.71112208443 iter/sec (stddev: 0.000008879371757819474) 0.91
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[2] 6469.04384623289 iter/sec (stddev: 0.000032476291951700004) 6385.2753846983305 iter/sec (stddev: 0.000021907884669115347) 0.99
benchmarks/test_guard_concurrency.py::test_g15_concurrent_first_resolve[4] 3356.689364413454 iter/sec (stddev: 0.00004111329368012495) 3366.336616997119 iter/sec (stddev: 0.00003935156806153975) 1.00
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[1] 10072.242318699298 iter/sec (stddev: 0.000009307765501202746) 9911.516587493415 iter/sec (stddev: 0.000011684714729632153) 0.98
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[2] 4281.351130188178 iter/sec (stddev: 0.000019000776312455008) 4287.266888791747 iter/sec (stddev: 0.000027293212092076704) 1.00
benchmarks/test_guard_concurrency.py::test_g15b_concurrent_first_resolve_sibling_children[4] 1973.7922172149208 iter/sec (stddev: 0.000048317974992732565) 2015.0327488095113 iter/sec (stddev: 0.00003613134660523785) 1.02
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[1] 40446.243404139925 iter/sec (stddev: 0.0000045389704893130524) 39872.885242659926 iter/sec (stddev: 0.000004605882062403509) 0.99
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[2] 14553.574557979913 iter/sec (stddev: 0.000018514384017690595) 14171.02681609552 iter/sec (stddev: 0.000013004583247066718) 0.97
benchmarks/test_guard_concurrency.py::test_g15c_worker_pool_floor_control[4] 5760.998634532999 iter/sec (stddev: 0.00003447738816963633) 5964.884723677308 iter/sec (stddev: 0.000029224346125394554) 1.04
benchmarks/test_guard_lifecycle.py::test_g6_build_child_container 1591484.9824104693 iter/sec (stddev: 2.952400691013809e-8) 1577167.0995698941 iter/sec (stddev: 2.6179414923151982e-8) 0.99
benchmarks/test_guard_lifecycle.py::test_g6b_build_child_container_auto_scope 1701239.3230699366 iter/sec (stddev: 1.90231733912875e-8) 1676712.9718870982 iter/sec (stddev: 2.1123799454950432e-8) 0.99
benchmarks/test_guard_lifecycle.py::test_g7_request_lifecycle_batch 2778.0614202399743 iter/sec (stddev: 0.00005473819940775417) 3182.1360520664016 iter/sec (stddev: 0.000011138213061022046) 1.15
benchmarks/test_guard_lifecycle.py::test_g7c_event_loop_floor_control 56674.290756748705 iter/sec (stddev: 0.0000027078851175417577) 58063.422225072056 iter/sec (stddev: 0.0000018514587085333763) 1.02
benchmarks/test_guard_lifecycle.py::test_g7b_request_cycle_sync 402570.468803493 iter/sec (stddev: 2.2439813077728983e-7) 405356.49421490397 iter/sec (stddev: 7.547901991822632e-8) 1.01
benchmarks/test_guard_lifecycle.py::test_g13_teardown_at_scale 62836.635306455224 iter/sec (stddev: 0.0000019497994807373216) 63183.63291861083 iter/sec (stddev: 0.0000014415760797939437) 1.01
benchmarks/test_guard_lifecycle.py::test_g13b_teardown_at_scale_async_no_finalizers 567.6773275757821 iter/sec (stddev: 0.0011265504175534556) 578.7420504292777 iter/sec (stddev: 0.0011473533415676236) 1.02
benchmarks/test_guard_resolve.py::test_g1_transient_resolve 2171531.4399859984 iter/sec (stddev: 2.1724020104077783e-8) 2146054.9180062083 iter/sec (stddev: 2.2308347919745596e-8) 0.99
benchmarks/test_guard_resolve.py::test_g2_cached_resolve 3640176.158312943 iter/sec (stddev: 1.0648741450445554e-8) 3623490.8885388975 iter/sec (stddev: 1.244386320445755e-8) 1.00
benchmarks/test_guard_resolve.py::test_g3_deep_chain 715703.830304074 iter/sec (stddev: 8.38112118127509e-8) 713641.2452689873 iter/sec (stddev: 3.787254773946193e-8) 1.00
benchmarks/test_guard_resolve.py::test_g4_wide_resolve 469199.4270699294 iter/sec (stddev: 3.838107420989795e-7) 434281.1461433443 iter/sec (stddev: 4.2895124107211606e-7) 0.93
benchmarks/test_guard_resolve.py::test_g5_cross_scope 2003171.9225849698 iter/sec (stddev: 2.492980511427549e-8) 1904057.9473517786 iter/sec (stddev: 2.4625495355603254e-8) 0.95
benchmarks/test_guard_resolve.py::test_g9_context_resolve 1398857.6438844684 iter/sec (stddev: 1.3916052577361174e-7) 1393145.6260126962 iter/sec (stddev: 1.6475919804395064e-7) 1.00
benchmarks/test_guard_resolve.py::test_g12_override_active_resolve 734482.3526295939 iter/sec (stddev: 6.444234234345051e-8) 708713.831453368 iter/sec (stddev: 5.3410851087238375e-8) 0.96
benchmarks/test_guard_resolve.py::test_g18_alias_hop 3642570.443948361 iter/sec (stddev: 8.991226965564255e-9) 3611838.986947799 iter/sec (stddev: 1.0086457846192054e-8) 0.99
benchmarks/test_guard_validate.py::test_g10_validate_deep_chain 35346.32041966281 iter/sec (stddev: 0.000020930825464968082) 35164.94357058799 iter/sec (stddev: 0.000018005574259584385) 0.99
benchmarks/test_guard_validate.py::test_g11_validate_wide 21137.983343882563 iter/sec (stddev: 0.000025131773152454616) 20915.067237467865 iter/sec (stddev: 0.000023726559578794315) 0.99

This comment was automatically generated by workflow using github-action-benchmark.

@lesnik512 lesnik512 changed the title docs: document Flask async views and the reserved Litestar di_container name docs: document the Litestar, Flask and Celery integration fixes Oct 17, 2026
@lesnik512
lesnik512 merged commit 49e532a into main Oct 17, 2026
22 of 23 checks passed
@lesnik512
lesnik512 deleted the docs/litestar-flask-follow-ups branch October 17, 2026 09:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant