django-bolt 0.2.7__tar.gz → 0.2.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of django-bolt might be problematic. Click here for more details.
- {django_bolt-0.2.7 → django_bolt-0.2.8}/Cargo.lock +1 -1
- {django_bolt-0.2.7 → django_bolt-0.2.8}/Cargo.toml +1 -1
- {django_bolt-0.2.7 → django_bolt-0.2.8}/PKG-INFO +2 -1
- {django_bolt-0.2.7 → django_bolt-0.2.8}/pyproject.toml +2 -1
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/__init__.py +1 -1
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/api.py +27 -22
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/middleware/__init__.py +2 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_compression.py +1 -2
- {django_bolt-0.2.7 → django_bolt-0.2.8}/.github/workflows/CI.yml +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/.gitignore +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/.python-version +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/BENCHMARK_BASELINE.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/BENCHMARK_DEV.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/CLAUDE.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/Makefile +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/README.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/TODO.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/ANNOTATION_GUIDE.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/ASYNC_DJANGO.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/CLASS_BASED_VIEWS.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/COMPRESSION.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/DEPENDENCY_INJECTION.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/DJANGO_ADMIN.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/EXCEPTIONS.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/GETTING_STARTED.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/GIL_OPTIMIZATION.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/LOGGING.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/MIDDLEWARE.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/OPENAPI.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/OPENAPI_ERROR_RESPONSES.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/OPENAPI_METADATA_IMPLEMENTATION.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/PAGINATION.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/PUBLISHING.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/README.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/RESPONSES.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/SECURITY.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/SERIALIZATION.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/TESTING_UTILITIES.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/favicon.png +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/icon.png +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/docs/logo.png +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/pytest.ini +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/_json.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/admin/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/admin/admin_detection.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/admin/asgi_bridge.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/admin/routes.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/admin/static.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/admin/static_routes.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/apps.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/async_collector.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/auth/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/auth/backends.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/auth/guards.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/auth/jwt_utils.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/auth/revocation.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/auth/token.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/binding.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/bootstrap.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/cli.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/decorators.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/dependencies.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/error_handlers.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/exceptions.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/health.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/logging/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/logging/config.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/logging/middleware.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/management/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/management/commands/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/management/commands/runbolt.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/middleware/compiler.py +0 -0
- {django_bolt-0.2.7/python/django_bolt → django_bolt-0.2.8/python/django_bolt/middleware}/compression.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/middleware/middleware.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/config.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/plugins.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/routes.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/schema_generator.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/base.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/callback.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/components.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/contact.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/discriminator.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/encoding.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/enums.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/example.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/external_documentation.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/header.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/info.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/license.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/link.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/media_type.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/oauth_flow.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/oauth_flows.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/open_api.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/operation.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/parameter.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/path_item.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/paths.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/reference.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/request_body.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/response.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/responses.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/schema.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/security_requirement.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/security_scheme.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/server.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/server_variable.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/tag.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/xml.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/pagination.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/param_functions.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/params.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/request_parsing.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/responses.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/router.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/serialization.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/status_codes.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/testing/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/testing/client.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/testing/helpers.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/types.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/typing.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/views.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/README.md +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/bench/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/bench/admin.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/bench/api.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/bench/apps.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/bench/migrations/0001_initial.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/bench/migrations/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/bench/models.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/bench/tests.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/bench/views.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/manage.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/100B +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/100B.txt +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/100K +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/100K.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/100K.txt +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/10K +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/10K.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/10K.txt +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/1K +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/1K.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/1K.txt +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/1M +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/1M.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/1M.txt +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/500K +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/500K.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/500K.txt +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/5M +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/5M.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/5M.txt +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/FILE_UPLOAD_1K +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/FILE_UPLOAD_1K_HEADERS.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/FORM_URLENCODED_1K +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/FORM_URLENCODED_1K_HEADERS.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/MULTIPART_1K +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/MULTIPART_1K_HEADERS.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/objects.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/persons_100.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/persons_50.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/test_data/persons_500.json +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/testproject/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/testproject/api.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/testproject/asgi.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/testproject/settings.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/testproject/test_api.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/testproject/urls.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/testproject/views.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/testproject/wsgi.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/users/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/users/admin.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/users/api.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/users/apps.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/users/migrations/0001_initial.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/users/migrations/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/users/models.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/users/tests.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/example/users/views.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/admin_tests/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/admin_tests/conftest.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/admin_tests/test_admin_with_django.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/admin_tests/urls.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/cbv/__init__.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/cbv/test_class_views.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/cbv/test_class_views_django_orm.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/cbv/test_class_views_features.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/cbv/test_class_views_with_client.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/conftest.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_action_decorator.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_auth_secret_key.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_cors_implementation.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_decorator_syntax.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_error_handling.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_file_response.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_global_cors.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_guards_auth.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_guards_integration.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_health.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_integration_validation.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_json_validation.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_jwt_auth.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_jwt_token.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_logging.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_logging_merge.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_middleware.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_middleware_server.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_model_viewset.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_models.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_openapi_docs.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_openapi_metadata.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_pagination.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_parameter_validation.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_request_get.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_syntax.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_testing_utilities.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_testing_utilities_simple.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_types.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/python/tests/test_viewset_unified.py +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/scripts/benchmark.sh +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/scripts/install_hey.sh +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/scripts/release.sh +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/direct_stream.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/error.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/handler.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/json.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/lib.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/metadata.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/middleware/auth.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/middleware/compression.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/middleware/mod.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/middleware/rate_limit.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/permissions.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/request.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/router.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/server.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/state.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/streaming.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/test_state.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/testing.rs +0 -0
- {django_bolt-0.2.7 → django_bolt-0.2.8}/src/validation.rs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-bolt
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.8
|
|
4
4
|
Classifier: Development Status :: 3 - Alpha
|
|
5
5
|
Classifier: Intended Audience :: Developers
|
|
6
6
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -25,6 +25,7 @@ Requires-Dist: click>=8.1
|
|
|
25
25
|
Requires-Dist: msgspec>=0.18
|
|
26
26
|
Requires-Dist: multipart>=1.3
|
|
27
27
|
Requires-Dist: pyjwt>=2.10.1
|
|
28
|
+
Requires-Dist: typing-extensions>=4.5.0
|
|
28
29
|
Requires-Dist: uvloop>=0.22.1 ; sys_platform != 'win32'
|
|
29
30
|
Requires-Dist: pyyaml>=6.0 ; extra == 'yaml'
|
|
30
31
|
Provides-Extra: yaml
|
|
@@ -4,7 +4,7 @@ build-backend = "maturin"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "django-bolt"
|
|
7
|
-
version = "0.2.
|
|
7
|
+
version = "0.2.8"
|
|
8
8
|
description = "High-performance API framework for Django with Rust-powered endpoints delivering 60k+ RPS"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -40,6 +40,7 @@ dependencies = [
|
|
|
40
40
|
"msgspec>=0.18",
|
|
41
41
|
"multipart>=1.3",
|
|
42
42
|
"pyjwt>=2.10.1",
|
|
43
|
+
"typing-extensions>=4.5.0",
|
|
43
44
|
"uvloop>=0.22.1; sys_platform != 'win32'"
|
|
44
45
|
]
|
|
45
46
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import inspect
|
|
4
|
+
import logging
|
|
4
5
|
import msgspec
|
|
5
6
|
import re
|
|
6
7
|
import time
|
|
@@ -8,17 +9,22 @@ from typing import Any, Callable, Dict, List, Tuple, Optional, get_origin, get_a
|
|
|
8
9
|
|
|
9
10
|
from .bootstrap import ensure_django_ready
|
|
10
11
|
from django_bolt import _core
|
|
12
|
+
|
|
13
|
+
# Import local modules
|
|
11
14
|
from .responses import StreamingResponse
|
|
12
15
|
from .exceptions import HTTPException
|
|
13
16
|
from .params import Param, Depends as DependsMarker
|
|
14
17
|
from .typing import FieldDefinition
|
|
15
|
-
|
|
18
|
+
from .middleware import CompressionConfig
|
|
19
|
+
from .logging.middleware import create_logging_middleware, LoggingMiddleware
|
|
20
|
+
from .exceptions import RequestValidationError, parse_msgspec_decode_error
|
|
16
21
|
# Import modularized components
|
|
17
22
|
from .binding import (
|
|
18
23
|
coerce_to_response_type,
|
|
19
24
|
coerce_to_response_type_async,
|
|
20
25
|
convert_primitive,
|
|
21
26
|
create_extractor,
|
|
27
|
+
get_msgspec_decoder
|
|
22
28
|
)
|
|
23
29
|
from .typing import is_msgspec_struct, is_optional, unwrap_optional
|
|
24
30
|
from .request_parsing import parse_form_data
|
|
@@ -26,12 +32,27 @@ from .dependencies import resolve_dependency
|
|
|
26
32
|
from .serialization import serialize_response
|
|
27
33
|
from .middleware.compiler import compile_middleware_meta
|
|
28
34
|
from .types import Request
|
|
35
|
+
from .views import APIView, ViewSet
|
|
36
|
+
from .status_codes import HTTP_201_CREATED, HTTP_204_NO_CONTENT
|
|
37
|
+
from .decorators import ActionHandler
|
|
38
|
+
from .error_handlers import handle_exception
|
|
39
|
+
from .openapi.schema_generator import SchemaGenerator
|
|
40
|
+
from .openapi import OpenAPIConfig, SwaggerRenderPlugin, RedocRenderPlugin, ScalarRenderPlugin, RapidocRenderPlugin, StoplightRenderPlugin, JsonRenderPlugin, YamlRenderPlugin
|
|
41
|
+
from .openapi.routes import OpenAPIRouteRegistrar
|
|
42
|
+
from .admin.routes import AdminRouteRegistrar
|
|
43
|
+
from .admin.static_routes import StaticRouteRegistrar
|
|
44
|
+
from .admin.admin_detection import detect_admin_url_prefix
|
|
45
|
+
|
|
46
|
+
from . import _json
|
|
29
47
|
|
|
30
48
|
Response = Tuple[int, List[Tuple[str, str]], bytes]
|
|
31
49
|
|
|
32
50
|
# Global registry for BoltAPI instances (used by autodiscovery)
|
|
33
51
|
_BOLT_API_REGISTRY = []
|
|
34
52
|
|
|
53
|
+
# Pre-compiled regex pattern for extracting path parameters
|
|
54
|
+
_PATH_PARAM_REGEX = re.compile(r'\{(\w+)\}')
|
|
55
|
+
|
|
35
56
|
|
|
36
57
|
def _extract_path_params(path: str) -> set[str]:
|
|
37
58
|
"""
|
|
@@ -41,7 +62,7 @@ def _extract_path_params(path: str) -> set[str]:
|
|
|
41
62
|
"/users/{user_id}" -> {"user_id"}
|
|
42
63
|
"/posts/{post_id}/comments/{comment_id}" -> {"post_id", "comment_id"}
|
|
43
64
|
"""
|
|
44
|
-
return set(
|
|
65
|
+
return set(_PATH_PARAM_REGEX.findall(path))
|
|
45
66
|
|
|
46
67
|
|
|
47
68
|
def extract_parameter_value(
|
|
@@ -156,8 +177,7 @@ def extract_parameter_value(
|
|
|
156
177
|
if not body_loaded:
|
|
157
178
|
body_bytes: bytes = request["body"]
|
|
158
179
|
if is_msgspec_struct(meta["body_struct_type"]):
|
|
159
|
-
|
|
160
|
-
from .exceptions import RequestValidationError, parse_msgspec_decode_error
|
|
180
|
+
|
|
161
181
|
decoder = get_msgspec_decoder(meta["body_struct_type"])
|
|
162
182
|
try:
|
|
163
183
|
value = decoder.decode(body_bytes)
|
|
@@ -173,7 +193,7 @@ def extract_parameter_value(
|
|
|
173
193
|
body=body_bytes,
|
|
174
194
|
) from e
|
|
175
195
|
else:
|
|
176
|
-
|
|
196
|
+
|
|
177
197
|
try:
|
|
178
198
|
value = msgspec.json.decode(body_bytes, type=meta["body_struct_type"])
|
|
179
199
|
except msgspec.ValidationError:
|
|
@@ -230,11 +250,9 @@ class BoltAPI:
|
|
|
230
250
|
if self.enable_logging:
|
|
231
251
|
# Create logging middleware (actual logging setup happens at server startup)
|
|
232
252
|
if logging_config is not None:
|
|
233
|
-
from .logging.middleware import LoggingMiddleware
|
|
234
253
|
self._logging_middleware = LoggingMiddleware(logging_config)
|
|
235
254
|
else:
|
|
236
255
|
# Use default logging configuration
|
|
237
|
-
from .logging.middleware import create_logging_middleware
|
|
238
256
|
self._logging_middleware = create_logging_middleware()
|
|
239
257
|
|
|
240
258
|
# Compression configuration
|
|
@@ -244,7 +262,6 @@ class BoltAPI:
|
|
|
244
262
|
self.compression = None
|
|
245
263
|
elif compression is None:
|
|
246
264
|
# Not provided, use default
|
|
247
|
-
from .compression import CompressionConfig
|
|
248
265
|
self.compression = CompressionConfig()
|
|
249
266
|
else:
|
|
250
267
|
# Custom config provided
|
|
@@ -253,7 +270,6 @@ class BoltAPI:
|
|
|
253
270
|
# OpenAPI configuration - enabled by default with sensible defaults
|
|
254
271
|
if openapi_config is None:
|
|
255
272
|
# Create default OpenAPI config
|
|
256
|
-
from .openapi import OpenAPIConfig, SwaggerRenderPlugin, RedocRenderPlugin, ScalarRenderPlugin, RapidocRenderPlugin, StoplightRenderPlugin, JsonRenderPlugin, YamlRenderPlugin
|
|
257
273
|
try:
|
|
258
274
|
# Try to get Django project name from settings
|
|
259
275
|
from django.conf import settings
|
|
@@ -420,7 +436,6 @@ class BoltAPI:
|
|
|
420
436
|
Raises:
|
|
421
437
|
ValueError: If view class doesn't implement any requested methods
|
|
422
438
|
"""
|
|
423
|
-
from .views import APIView
|
|
424
439
|
|
|
425
440
|
def decorator(view_cls: type) -> type:
|
|
426
441
|
# Validate that view_cls is an APIView subclass
|
|
@@ -538,8 +553,6 @@ class BoltAPI:
|
|
|
538
553
|
Returns:
|
|
539
554
|
Decorator function that registers the viewset
|
|
540
555
|
"""
|
|
541
|
-
from .views import ViewSet
|
|
542
|
-
from .status_codes import HTTP_201_CREATED, HTTP_204_NO_CONTENT
|
|
543
556
|
|
|
544
557
|
def decorator(viewset_cls: type) -> type:
|
|
545
558
|
# Validate that viewset_cls is a ViewSet subclass
|
|
@@ -627,7 +640,6 @@ class BoltAPI:
|
|
|
627
640
|
"""
|
|
628
641
|
import inspect
|
|
629
642
|
import types
|
|
630
|
-
from .decorators import ActionHandler
|
|
631
643
|
|
|
632
644
|
# Get class-level auth and guards (if any)
|
|
633
645
|
class_auth = getattr(view_cls, 'auth', None)
|
|
@@ -934,7 +946,6 @@ class BoltAPI:
|
|
|
934
946
|
def _handle_http_exception(self, he: HTTPException) -> Response:
|
|
935
947
|
"""Handle HTTPException and return response."""
|
|
936
948
|
try:
|
|
937
|
-
from . import _json
|
|
938
949
|
body = _json.encode({"detail": he.detail})
|
|
939
950
|
headers = [("content-type", "application/json")]
|
|
940
951
|
except Exception:
|
|
@@ -948,9 +959,8 @@ class BoltAPI:
|
|
|
948
959
|
|
|
949
960
|
def _handle_generic_exception(self, e: Exception, request: Dict[str, Any] = None) -> Response:
|
|
950
961
|
"""Handle generic exception using error_handlers module."""
|
|
951
|
-
from . import error_handlers
|
|
952
962
|
# Use the error handler which respects Django DEBUG setting
|
|
953
|
-
return
|
|
963
|
+
return handle_exception(e, debug=None, request=request) # debug will be checked dynamically
|
|
954
964
|
|
|
955
965
|
async def _dispatch(self, handler: Callable, request: Dict[str, Any], handler_id: int = None) -> Response:
|
|
956
966
|
"""Async dispatch that calls the handler and returns response tuple.
|
|
@@ -975,7 +985,7 @@ class BoltAPI:
|
|
|
975
985
|
logger = logging_middleware.logger
|
|
976
986
|
should_time = False
|
|
977
987
|
try:
|
|
978
|
-
if logger.isEnabledFor(
|
|
988
|
+
if logger.isEnabledFor(logging.INFO):
|
|
979
989
|
should_time = True
|
|
980
990
|
except Exception:
|
|
981
991
|
pass
|
|
@@ -1034,7 +1044,6 @@ class BoltAPI:
|
|
|
1034
1044
|
OpenAPI schema as dictionary.
|
|
1035
1045
|
"""
|
|
1036
1046
|
if self._openapi_schema is None:
|
|
1037
|
-
from .openapi.schema_generator import SchemaGenerator
|
|
1038
1047
|
|
|
1039
1048
|
generator = SchemaGenerator(self, self.openapi_config)
|
|
1040
1049
|
openapi = generator.generate()
|
|
@@ -1047,7 +1056,6 @@ class BoltAPI:
|
|
|
1047
1056
|
|
|
1048
1057
|
Delegates to OpenAPIRouteRegistrar for cleaner separation of concerns.
|
|
1049
1058
|
"""
|
|
1050
|
-
from .openapi.routes import OpenAPIRouteRegistrar
|
|
1051
1059
|
|
|
1052
1060
|
registrar = OpenAPIRouteRegistrar(self)
|
|
1053
1061
|
registrar.register_routes()
|
|
@@ -1061,7 +1069,6 @@ class BoltAPI:
|
|
|
1061
1069
|
host: Server hostname for ASGI scope
|
|
1062
1070
|
port: Server port for ASGI scope
|
|
1063
1071
|
"""
|
|
1064
|
-
from .admin.routes import AdminRouteRegistrar
|
|
1065
1072
|
|
|
1066
1073
|
registrar = AdminRouteRegistrar(self)
|
|
1067
1074
|
registrar.register_routes(host, port)
|
|
@@ -1071,7 +1078,6 @@ class BoltAPI:
|
|
|
1071
1078
|
|
|
1072
1079
|
Delegates to StaticRouteRegistrar for cleaner separation of concerns.
|
|
1073
1080
|
"""
|
|
1074
|
-
from .admin.static_routes import StaticRouteRegistrar
|
|
1075
1081
|
|
|
1076
1082
|
registrar = StaticRouteRegistrar(self)
|
|
1077
1083
|
registrar.register_routes()
|
|
@@ -1089,7 +1095,6 @@ class BoltAPI:
|
|
|
1089
1095
|
if self.enable_admin:
|
|
1090
1096
|
self._register_admin_routes(host, port)
|
|
1091
1097
|
if self._admin_routes_registered:
|
|
1092
|
-
from .admin.admin_detection import detect_admin_url_prefix
|
|
1093
1098
|
admin_prefix = detect_admin_url_prefix() or 'admin'
|
|
1094
1099
|
print(f"[django-bolt] Django admin available at http://{host}:{port}/{admin_prefix}/")
|
|
1095
1100
|
|
|
@@ -17,6 +17,7 @@ from .middleware import (
|
|
|
17
17
|
CORSMiddleware,
|
|
18
18
|
RateLimitMiddleware,
|
|
19
19
|
)
|
|
20
|
+
from .compression import CompressionConfig
|
|
20
21
|
|
|
21
22
|
__all__ = [
|
|
22
23
|
"Middleware",
|
|
@@ -29,4 +30,5 @@ __all__ = [
|
|
|
29
30
|
"no_compress",
|
|
30
31
|
"CORSMiddleware",
|
|
31
32
|
"RateLimitMiddleware",
|
|
33
|
+
"CompressionConfig",
|
|
32
34
|
]
|
|
@@ -5,8 +5,7 @@ Tests both global compression configuration and per-route skip functionality.
|
|
|
5
5
|
"""
|
|
6
6
|
import pytest
|
|
7
7
|
from django_bolt import BoltAPI
|
|
8
|
-
from django_bolt.
|
|
9
|
-
from django_bolt.middleware import skip_middleware, no_compress
|
|
8
|
+
from django_bolt.middleware import skip_middleware, no_compress, CompressionConfig
|
|
10
9
|
from django_bolt.testing import TestClient
|
|
11
10
|
|
|
12
11
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/external_documentation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_bolt-0.2.7 → django_bolt-0.2.8}/python/django_bolt/openapi/spec/security_requirement.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|