tina4-python 3.13.138__tar.gz → 3.13.139__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.
- {tina4_python-3.13.138 → tina4_python-3.13.139}/PKG-INFO +18 -5
- {tina4_python-3.13.138 → tina4_python-3.13.139}/README.md +17 -4
- {tina4_python-3.13.138 → tina4_python-3.13.139}/pyproject.toml +1 -1
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/.tina4-metrics.json +2366 -90
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/__init__.py +1 -1
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/api/__init__.py +35 -4
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/auth/__init__.py +87 -4
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/cli/__init__.py +13 -4
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/core/middleware.py +4 -1
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/core/request.py +10 -4
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/core/router.py +4 -4
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/core/server.py +49 -18
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/__init__.py +7 -2
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/adapter.py +25 -0
- tina4_python-3.13.139/tina4_python/database/async_api.py +217 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/connection.py +416 -352
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/firebird.py +17 -22
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/mongodb.py +16 -9
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/mssql.py +26 -30
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/mysql.py +20 -20
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/odbc.py +34 -27
- tina4_python-3.13.139/tina4_python/database/pool.py +357 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/postgres.py +44 -35
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/sqlite.py +31 -25
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/frond/engine.py +5 -1
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/graphql/__init__.py +79 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/mcp/__init__.py +5 -5
- tina4_python-3.13.139/tina4_python/orm/async_api.py +103 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/orm/model.py +34 -2
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/push/__init__.py +15 -2
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/query_builder/__init__.py +18 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/queue/job.py +11 -2
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/queue/kafka_backend.py +14 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/queue/lite_backend.py +16 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/queue/mongo_backend.py +39 -3
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/queue/rabbitmq_backend.py +25 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/queue_backends/rabbitmq_backend.py +12 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/session/__init__.py +48 -5
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/sso.py +34 -3
- tina4_python-3.13.139/tina4_python/ssrf.py +163 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/websocket/__init__.py +5 -1
- {tina4_python-3.13.138 → tina4_python-3.13.139}/.gitignore +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/COMMERCIAL-LICENSE.md +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/LICENSE +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/NOTICE +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/CLAUDE.md +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/HtmlElement.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/Testing.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/_import_helper.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/ai/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/ai/client.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/cache/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/container/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/context/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/context/chunker.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/core/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/core/cache.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/core/constants.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/core/events.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/core/port_takeover.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/core/rate_limiter.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/core/response.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/crud/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/database_url.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/database/sql_translator.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/debug/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/debug/error_overlay.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/dev_admin/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/dev_admin/metrics.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/dev_admin/plan.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/dev_admin/project_index.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/docs.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/docstore/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/dotenv/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/env.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/frond/FROND.md +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/frond/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/frond/compiler.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/frond/parser.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/auth/meta.json +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/auth/src/routes/api/gallery_auth.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/database/meta.json +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/database/src/routes/api/gallery_db.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/error-overlay/meta.json +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/error-overlay/src/routes/api/gallery_crash.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/orm/meta.json +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/orm/src/orm/Product.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/orm/src/routes/api/gallery_products.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/queue/meta.json +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/queue/src/routes/api/gallery_queue.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/rest-api/meta.json +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/rest-api/src/routes/api/gallery_hello.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/templates/meta.json +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/templates/src/routes/gallery_page.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/gallery/templates/src/templates/gallery_page.twig +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/graph/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/graph/adapter.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/graph/adapters/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/graph/adapters/arango.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/graph/adapters/bolt.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/graph/adapters/ultipa.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/graph/graph_url.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/i18n/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/mcp/protocol.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/mcp/tools.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/messenger/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/migration/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/migration/runner.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/mqtt/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/mqtt/message.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/orm/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/orm/collection.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/orm/fields.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/orm/point.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/THIRD-PARTY-NOTICES.md +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/__feedback/widget.js +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/bundled-component-provenance.json +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/css/tina4.css +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/css/tina4.min.css +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/favicon.ico +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/images/logo.svg +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/images/tina4-logo-icon.webp +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/js/frond.js +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/js/frond.min.js +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/js/tina4-dev-admin.min.js +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/js/tina4.min.js +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/js/tina4js.min.js +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/licenses/swagger-ui-3.10.0-original-notice.txt +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/licenses/swagger-ui-5.17.14-NOTICE.txt +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/licenses/swagger-ui-Apache-2.0.txt +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/licenses/tina4-css-MIT.txt +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/licenses/tina4-dev-admin-components.json +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/licenses/tina4-dev-admin-third-party.txt +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/licenses/tina4-js-MIT.txt +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/swagger/index.html +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/public/swagger/oauth2-redirect.html +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/push/_base.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/push/_cryptography.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/push/_libcrypto.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/queue/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/queue/amqp_url.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/queue_backends/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/queue_backends/kafka_backend.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/queue_backends/mongo_backend.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/realtime/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/realtime/models/Attachment.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/realtime/models/Channel.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/realtime/models/ChannelMember.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/realtime/models/Message.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/realtime/models/Workspace.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/realtime/models/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/realtime/storage.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/seeder/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/service/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/session_handlers/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/session_handlers/memcached_handler.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/session_handlers/mongodb_handler.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/session_handlers/redis_handler.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/session_handlers/valkey_handler.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/swagger/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/components/crud.twig +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/docker/distroless/Dockerfile +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/docker/poetry/Dockerfile +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/docker/python/Dockerfile +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/docker/uv/Dockerfile +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/errors/302.twig +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/errors/401.twig +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/errors/403.twig +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/errors/404.twig +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/errors/500.twig +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/errors/502.twig +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/errors/503.twig +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/errors/base.twig +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/frontend/README.md +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/templates/readme.md +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/test/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/test_client/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/af/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/af/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/en/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/en/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/es/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/es/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/fr/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/fr/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/ja/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/ja/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/zh/LC_MESSAGES/messages.mo +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/translations/zh/LC_MESSAGES/messages.po +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/validator/__init__.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/websocket/backplane.py +0 -0
- {tina4_python-3.13.138 → tina4_python-3.13.139}/tina4_python/wsdl/__init__.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: tina4-python
|
|
3
|
-
Version: 3.13.
|
|
3
|
+
Version: 3.13.139
|
|
4
4
|
Summary: Tina4 Python v3 — Zero-dependency, lightweight web framework
|
|
5
5
|
Author-email: Andre van Zuydam <andrevanzuydam@gmail.com>
|
|
6
6
|
License-Expression: MPL-2.0
|
|
@@ -295,13 +295,13 @@ from tina4_python.core.router import get, post, noauth
|
|
|
295
295
|
@get("/api/users")
|
|
296
296
|
async def list_users(request, response):
|
|
297
297
|
from src.orm.User import User
|
|
298
|
-
return response(User.
|
|
298
|
+
return response(await User.select_async(limit=100))
|
|
299
299
|
|
|
300
300
|
@get("/api/users/{id:int}")
|
|
301
301
|
async def get_user(id, request, response):
|
|
302
302
|
from src.orm.User import User
|
|
303
303
|
user = User()
|
|
304
|
-
if user.
|
|
304
|
+
if await user.load_async("id = ?", [id]):
|
|
305
305
|
return response(user.to_dict())
|
|
306
306
|
return response({"error": "Not found"}, 404)
|
|
307
307
|
|
|
@@ -310,10 +310,14 @@ async def get_user(id, request, response):
|
|
|
310
310
|
async def create_user(request, response):
|
|
311
311
|
from src.orm.User import User
|
|
312
312
|
user = User(request.body)
|
|
313
|
-
user.
|
|
313
|
+
await user.save_async()
|
|
314
314
|
return response(user.to_dict(), 201)
|
|
315
315
|
```
|
|
316
316
|
|
|
317
|
+
An `async def` route awaits the `*_async` form of every database and ORM call, so a
|
|
318
|
+
slow query never holds up another request. A plain `def` route can use the sync calls:
|
|
319
|
+
Tina4 runs it in a worker thread.
|
|
320
|
+
|
|
317
321
|
### 6. Add a template
|
|
318
322
|
|
|
319
323
|
Create `src/templates/base.twig`:
|
|
@@ -453,8 +457,17 @@ result = db.fetch("SELECT * FROM users WHERE age > ?", [18], limit=20, offset=0)
|
|
|
453
457
|
row = db.fetch_one("SELECT * FROM users WHERE id = ?", [1])
|
|
454
458
|
db.insert("users", {"name": "Alice", "email": "alice@test.com"})
|
|
455
459
|
db.commit()
|
|
460
|
+
|
|
461
|
+
# In an async def route, await the twin of each call
|
|
462
|
+
row = await db.fetch_one_async("SELECT * FROM users WHERE id = ?", [1])
|
|
463
|
+
async with db.transaction_async():
|
|
464
|
+
await db.insert_async("users", {"name": "Bob", "email": "bob@test.com"})
|
|
456
465
|
```
|
|
457
466
|
|
|
467
|
+
Each `Database` is a pool of connections (`TINA4_DB_POOL`, default 10). Every call borrows
|
|
468
|
+
one for itself and hands it back, and a transaction keeps its connection until it commits or
|
|
469
|
+
rolls back, so two requests never share one.
|
|
470
|
+
|
|
458
471
|
### Middleware
|
|
459
472
|
|
|
460
473
|
```python
|
|
@@ -535,7 +548,7 @@ Auto-generated at `/swagger`:
|
|
|
535
548
|
@tags(["users"])
|
|
536
549
|
@get("/api/users")
|
|
537
550
|
async def users(request, response):
|
|
538
|
-
return response(User.
|
|
551
|
+
return response(await User.select_async())
|
|
539
552
|
```
|
|
540
553
|
|
|
541
554
|
### Event System
|
|
@@ -226,13 +226,13 @@ from tina4_python.core.router import get, post, noauth
|
|
|
226
226
|
@get("/api/users")
|
|
227
227
|
async def list_users(request, response):
|
|
228
228
|
from src.orm.User import User
|
|
229
|
-
return response(User.
|
|
229
|
+
return response(await User.select_async(limit=100))
|
|
230
230
|
|
|
231
231
|
@get("/api/users/{id:int}")
|
|
232
232
|
async def get_user(id, request, response):
|
|
233
233
|
from src.orm.User import User
|
|
234
234
|
user = User()
|
|
235
|
-
if user.
|
|
235
|
+
if await user.load_async("id = ?", [id]):
|
|
236
236
|
return response(user.to_dict())
|
|
237
237
|
return response({"error": "Not found"}, 404)
|
|
238
238
|
|
|
@@ -241,10 +241,14 @@ async def get_user(id, request, response):
|
|
|
241
241
|
async def create_user(request, response):
|
|
242
242
|
from src.orm.User import User
|
|
243
243
|
user = User(request.body)
|
|
244
|
-
user.
|
|
244
|
+
await user.save_async()
|
|
245
245
|
return response(user.to_dict(), 201)
|
|
246
246
|
```
|
|
247
247
|
|
|
248
|
+
An `async def` route awaits the `*_async` form of every database and ORM call, so a
|
|
249
|
+
slow query never holds up another request. A plain `def` route can use the sync calls:
|
|
250
|
+
Tina4 runs it in a worker thread.
|
|
251
|
+
|
|
248
252
|
### 6. Add a template
|
|
249
253
|
|
|
250
254
|
Create `src/templates/base.twig`:
|
|
@@ -384,8 +388,17 @@ result = db.fetch("SELECT * FROM users WHERE age > ?", [18], limit=20, offset=0)
|
|
|
384
388
|
row = db.fetch_one("SELECT * FROM users WHERE id = ?", [1])
|
|
385
389
|
db.insert("users", {"name": "Alice", "email": "alice@test.com"})
|
|
386
390
|
db.commit()
|
|
391
|
+
|
|
392
|
+
# In an async def route, await the twin of each call
|
|
393
|
+
row = await db.fetch_one_async("SELECT * FROM users WHERE id = ?", [1])
|
|
394
|
+
async with db.transaction_async():
|
|
395
|
+
await db.insert_async("users", {"name": "Bob", "email": "bob@test.com"})
|
|
387
396
|
```
|
|
388
397
|
|
|
398
|
+
Each `Database` is a pool of connections (`TINA4_DB_POOL`, default 10). Every call borrows
|
|
399
|
+
one for itself and hands it back, and a transaction keeps its connection until it commits or
|
|
400
|
+
rolls back, so two requests never share one.
|
|
401
|
+
|
|
389
402
|
### Middleware
|
|
390
403
|
|
|
391
404
|
```python
|
|
@@ -466,7 +479,7 @@ Auto-generated at `/swagger`:
|
|
|
466
479
|
@tags(["users"])
|
|
467
480
|
@get("/api/users")
|
|
468
481
|
async def users(request, response):
|
|
469
|
-
return response(User.
|
|
482
|
+
return response(await User.select_async())
|
|
470
483
|
```
|
|
471
484
|
|
|
472
485
|
### Event System
|