duckframework 1.0.2__tar.gz → 2.0.0__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.
- duckframework-2.0.0/PKG-INFO +546 -0
- duckframework-2.0.0/README.md +495 -0
- duckframework-2.0.0/duck/app/app.py +1306 -0
- duckframework-2.0.0/duck/app/base.py +337 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/app/microapp.py +115 -145
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/urls.py +1 -1
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/utils.py +15 -2
- duckframework-2.0.0/duck/contrib/auth/__init__.py +63 -0
- duckframework-2.0.0/duck/contrib/auth/exceptions.py +9 -0
- duckframework-2.0.0/duck/contrib/auth/helpers.py +381 -0
- duckframework-2.0.0/duck/contrib/jwt/__init__.py +189 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/reloader/ducksight.py +11 -4
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/sync/smart_async.py +14 -2
- duckframework-2.0.0/duck/etc/apps/counterapp/views/__init__.py +547 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/middlewares.py +2 -2
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/settings.py +8 -38
- duckframework-2.0.0/duck/etc/structures/projects/full/web/ui/static/images/duck-logo.png +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/web/settings.py +8 -9
- duckframework-2.0.0/duck/etc/structures/projects/mini/web/ui/static/images/duck-logo.png +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/settings.py +7 -6
- duckframework-2.0.0/duck/etc/structures/projects/normal/web/ui/static/images/duck-logo.png +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/exceptions/all.py +6 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/__init__.py +60 -24
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/button.py +2 -1
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/container.py +3 -3
- duckframework-2.0.0/duck/html/components/core/browser_state.py +58 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/exceptions.py +0 -7
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/force_update.py +26 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/opcodes.py +10 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/props.py +5 -2
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/staticfiles/lively.js +50 -15
- duckframework-2.0.0/duck/html/components/core/staticfiles/lively.min.js +1 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/system.py +5 -2
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/warnings.py +9 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/websocket.py +179 -29
- duckframework-2.0.0/duck/html/components/duck.py +54 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/extensions/__init__.py +10 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/footer.py +13 -3
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/form.py +4 -5
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/image.py +4 -4
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/input.py +11 -11
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/link.py +2 -2
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/lively.py +3 -2
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/modal.py +98 -42
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/navbar.py +3 -2
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/page.py +63 -34
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/select.py +41 -37
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/snackbar.py +40 -24
- duckframework-2.0.0/duck/html/components/span.py +13 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/table_of_contents.py +23 -5
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/utils/include.py +1 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/asgi.py +4 -4
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/handler.py +7 -7
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/httpd/http2/event_handler.py +1 -8
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/httpd/httpd.py +7 -2
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/processor.py +43 -6
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/proxyhandler.py +3 -8
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/response_finalizer.py +4 -14
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/wsgi.py +4 -4
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/fileuploads/handlers/__init__.py +23 -3
- duckframework-2.0.0/duck/http/jwt/engine.py +391 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/__init__.py +5 -2
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/contrib/__init__.py +3 -0
- duckframework-2.0.0/duck/http/middlewares/contrib/jwt.py +248 -0
- duckframework-2.0.0/duck/http/middlewares/contrib/session.py +134 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/security/csrf.py +29 -14
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/security/header.py +0 -2
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/querydict.py +5 -3
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/request.py +204 -228
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/response.py +15 -10
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/response_payload.py +3 -3
- duckframework-2.0.0/duck/http/session/connector.py +203 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/session/engine.py +150 -54
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/meta/__init__.py +18 -1
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/routes/__init__.py +2 -1
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/routes/route_registry.py +42 -53
- duckframework-2.0.0/duck/secrets.py +228 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/settings/loaded.py +29 -11
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/settings/settings.py +62 -52
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/shortcuts/__init__.py +139 -20
- duckframework-2.0.0/duck/tests/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/tests/test_server.py +8 -4
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/asyncio/__init__.py +10 -0
- duckframework-2.0.0/duck/utils/caching/__init__.py +1305 -0
- duckframework-2.0.0/duck/utils/caching/encrypted.py +411 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/email/__init__.py +23 -22
- duckframework-2.0.0/duck/utils/importer.py +58 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/performance.py +12 -6
- duckframework-2.0.0/duck/utils/port_registry.py +80 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/ssl.py +29 -38
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/urlcrack.py +1 -1
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/urldecode.py +17 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/xsocket/__init__.py +1 -1
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/version.py +4 -2
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/views.py +27 -0
- duckframework-2.0.0/duckframework.egg-info/PKG-INFO +546 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duckframework.egg-info/SOURCES.txt +17 -2
- {duckframework-1.0.2 → duckframework-2.0.0}/duckframework.egg-info/requires.txt +2 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/pyproject.toml +7 -4
- duckframework-1.0.2/PKG-INFO +0 -251
- duckframework-1.0.2/README.md +0 -202
- duckframework-1.0.2/duck/app/app.py +0 -1292
- duckframework-1.0.2/duck/etc/apps/counterapp/views/__init__.py +0 -184
- duckframework-1.0.2/duck/html/components/duck.py +0 -32
- duckframework-1.0.2/duck/http/middlewares/contrib/session.py +0 -99
- duckframework-1.0.2/duck/http/session/session_storage_connector.py +0 -127
- duckframework-1.0.2/duck/secrets.py +0 -68
- duckframework-1.0.2/duck/utils/caching/__init__.py +0 -533
- duckframework-1.0.2/duck/utils/importer.py +0 -31
- duckframework-1.0.2/duck/utils/port_recorder.py +0 -25
- duckframework-1.0.2/duckframework.egg-info/PKG-INFO +0 -251
- {duckframework-1.0.2 → duckframework-2.0.0}/AUTHORS.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/LICENSE +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/MANIFEST.in +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/__main__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/ansi.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/app/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/art.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/automation/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/automation/dispatcher.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/automation/trigger.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/bridge.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/logging.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/middlewares/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/middlewares/auth.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/middlewares/clickjacking.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/middlewares/common.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/middlewares/csrf.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/middlewares/duckshare.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/middlewares/messages.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/middlewares/security.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/middlewares/session.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/session/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/session/proxyengine.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/setup.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/templatetags/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/templatetags/ducktags.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/backend/django/views.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/collectstatic.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/django.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/integration/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/integration/_django_settings.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/integration/_django_urls.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/logs.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/makeblueprint.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/makeproject.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/monitor.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/runserver.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/runtests.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/service.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/sitemap.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/cli/commands/ssl_gen.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/compat.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/asyncio.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/reloader/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/reloader/dependency_graph.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/responses/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/responses/errors.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/responses/simple_response.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/responses/template_response.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/sitemap.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/sync/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/websockets/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/websockets/exceptions.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/websockets/extensions.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/websockets/frame.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/websockets/logging.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/contrib/websockets/opcodes.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/csp.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/db/hooks.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/env.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/certbot/blueprint.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/certbot/views/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/counterapp/blueprint.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/counterapp/static/css/bootstrap-icons.min.css +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/counterapp/static/css/bootstrap.min.css +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/counterapp/static/css/fonts/bootstrap-icons.woff +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/counterapp/static/css/fonts/bootstrap-icons.woff2 +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/counterapp/static/css/prism.css +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/counterapp/static/js/bootstrap.min.js +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/counterapp/static/js/jquery-3.7.1.min.js +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/counterapp/static/js/prism.js +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/blueprint.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/shared_static/duck-favicon.png +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/static/css/base.css +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/static/css/contact.css +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/static/images/about-us.jpg +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/static/images/duck-cover-bw.png +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/static/images/duck-default-bw.png +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/static/images/duck-default.png +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/static/images/duck-favicon.png +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/static/images/duck.png +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/static/images/kofi_donate_img.png +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/templates/about.html +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/templates/base.html +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/templates/contact.html +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/templates/home.html +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/views/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/views/about.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/views/contact.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/views/context/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/views/home.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/views/speedtest.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/defaultsite/views/static.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/essentials/blueprint.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/essentials/views/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/essentials/views/media.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/essentials/views/sitemap.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/apps/essentials/views/static.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/automations/certbot.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/headers/default.json +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/headers/default_ssl.json +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/internals/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/internals/profile_app.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/internals/template.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/normalizers.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/settings.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/ssl/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/ssl/server.crt +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/ssl/server.csr +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/ssl/server.key +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/ssl_defaults.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/statuscodes.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/blueprint/views/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/.env +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/.gitignore +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/LICENSE +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/TODO.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/etc/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/etc/ssl/server.crt +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/etc/ssl/server.key +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/requirements.txt +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/automations.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/backend/django/duckapp/duckapp/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/backend/django/duckapp/duckapp/asgi.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/backend/django/duckapp/duckapp/settings.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/backend/django/duckapp/duckapp/urls.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/backend/django/duckapp/duckapp/wsgi.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/backend/django/duckapp/manage.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/main.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/templatetags.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/ui/components/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/ui/pages/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/ui/static/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/ui/templates/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/urls.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/full/web/views.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/etc/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/etc/ssl/server.crt +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/etc/ssl/server.key +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/requirements.txt +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/web/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/web/backend/django/duckapp/duckapp/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/web/backend/django/duckapp/duckapp/asgi.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/web/backend/django/duckapp/duckapp/settings.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/web/backend/django/duckapp/duckapp/urls.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/web/backend/django/duckapp/duckapp/wsgi.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/web/backend/django/duckapp/manage.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/web/main.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/web/urls.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/mini/web/views.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/LICENSE +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/TODO.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/etc/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/etc/ssl/server.crt +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/etc/ssl/server.key +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/requirements.txt +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/backend/django/duckapp/duckapp/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/backend/django/duckapp/duckapp/asgi.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/backend/django/duckapp/duckapp/settings.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/backend/django/duckapp/duckapp/urls.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/backend/django/duckapp/duckapp/wsgi.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/backend/django/duckapp/manage.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/main.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/ui/components/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/ui/pages/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/ui/static/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/ui/templates/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/urls.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/normal/web/views.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/etc/README.md +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/etc/ssl/server.crt +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/etc/ssl/server.key +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/web/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/web/backend/django/duckapp/duckapp/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/web/backend/django/duckapp/duckapp/asgi.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/web/backend/django/duckapp/duckapp/settings.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/web/backend/django/duckapp/duckapp/urls.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/web/backend/django/duckapp/duckapp/wsgi.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/web/backend/django/duckapp/manage.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/web/settings.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/structures/projects/testing/web/urls.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/templates/base_response.html +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/templates/csrf_error.html +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/templates/simple_icon_response.html +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/templates/simple_response.html +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/etc/templatetags/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/exceptions/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/exceptions/error_ids.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/globals.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/card.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/checkbox.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/code.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/children.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/mutation.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/staticfiles/msgpack.min.js +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/utils.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/core/vdom.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/fileinput.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/heading.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/hero.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/icon.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/label.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/paragraph.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/progressbar.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/script.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/section.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/style.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/templatetags/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/textarea.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/utils/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/utils/caching.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/utils/static.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/html/components/video.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/content.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/httpd/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/httpd/http2/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/httpd/http2/protocol.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/httpd/servers.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/core/httpd/task_executor.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/fileuploads/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/fileuploads/multipart.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/headers.py +0 -0
- {duckframework-1.0.2/duck/http/middlewares/security/modules → duckframework-2.0.0/duck/http/jwt}/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/contrib/django.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/contrib/metashare.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/contrib/www_redirect.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/security/__init__.py +0 -0
- {duckframework-1.0.2/duck/http/session → duckframework-2.0.0/duck/http/middlewares/security/modules}/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/security/modules/command_injection.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/security/modules/header_injection.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/security/modules/sql_injection.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/security/modules/xss.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/security/requestslimit.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/middlewares/security/url.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/mimes.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/normalizers/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/http/request_data.py +0 -0
- {duckframework-1.0.2/duck/logging → duckframework-2.0.0/duck/http/session}/__init__.py +0 -0
- {duckframework-1.0.2/duck/template → duckframework-2.0.0/duck/logging}/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/logging/console.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/logging/logger.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/processes.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/routes/route_blueprint.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/settings/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/setup/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/setup/makeblueprint.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/setup/makeproject.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/storage.py +0 -0
- {duckframework-1.0.2/duck/tests → duckframework-2.0.0/duck/template}/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/template/csrf.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/template/environment.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/template/loaders.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/template/response.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/template/templatetags.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/tests/test_routes.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/urls.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/asyncio/eventloop.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/callabletools.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/codesandbox.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/cookie_consent.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/dateutils.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/email/collection.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/encrypt.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/eventlist.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/extraction.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/file.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/fileio.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/filelock.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/headers.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/ipc.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/lazy.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/multiprocessing/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/multiprocessing/process_manager.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/multiprocessing/processpool.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/multiprocessing/proxy.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/net.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/object_from_id.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/object_mapping.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/path.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/platform.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/rand_domain.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/safe_compare.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/safemarkup.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/slug.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/string.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/temp.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/threading/__init__.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/threading/patch.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/threading/thread_manager.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/threading/threadpool.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/timer.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/validation.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/wildcard.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duck/utils/xsocket/io.py +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duckframework.egg-info/dependency_links.txt +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duckframework.egg-info/entry_points.txt +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/duckframework.egg-info/top_level.txt +0 -0
- {duckframework-1.0.2 → duckframework-2.0.0}/setup.cfg +0 -0
|
@@ -0,0 +1,546 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: duckframework
|
|
3
|
+
Version: 2.0.0
|
|
4
|
+
Summary: Duck is a powerful, open-source, full-fledged Python-based web server, framework, and reverse proxy designed for building modern, customizable web applications — from small sites to large-scale platforms.
|
|
5
|
+
Author-email: Brian Musakwa <digreatbrian@gmail.com>
|
|
6
|
+
Maintainer-email: Brian Musakwa <digreatbrian@gmail.com>
|
|
7
|
+
License-Expression: BSD-3-Clause
|
|
8
|
+
Project-URL: Homepage, https://duckframework.com
|
|
9
|
+
Project-URL: Source, https://github.com/duckframework/duck
|
|
10
|
+
Project-URL: Issues, https://github.com/duckframework/duck/issues
|
|
11
|
+
Project-URL: Funding, https://duckframework.xyz/contribute
|
|
12
|
+
Project-URL: Documentation, https://docs.duckframework.com
|
|
13
|
+
Keywords: Python,web framework,web server,reverse proxy,HTTP/2,WSGI,ASGI,Django integration,Flask,Tornado,FastAPI,microservices,middleware,high-performance,async,Duck framework,routing,load balancing,HTTP proxy,web application
|
|
14
|
+
Classifier: Development Status :: 4 - Beta
|
|
15
|
+
Classifier: Environment :: Web Environment
|
|
16
|
+
Classifier: Intended Audience :: Developers
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
23
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
24
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
25
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
26
|
+
Classifier: Topic :: Internet :: WWW/HTTP
|
|
27
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
|
|
28
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
|
|
29
|
+
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
|
|
30
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
31
|
+
Description-Content-Type: text/markdown
|
|
32
|
+
License-File: LICENSE
|
|
33
|
+
License-File: AUTHORS.md
|
|
34
|
+
Requires-Dist: Django>=5.1.5
|
|
35
|
+
Requires-Dist: Jinja2>=3.1.5
|
|
36
|
+
Requires-Dist: watchdog>=4.0.1
|
|
37
|
+
Requires-Dist: requests>=2.31.0
|
|
38
|
+
Requires-Dist: h2>=4.2.0
|
|
39
|
+
Requires-Dist: msgpack>=1.1.1
|
|
40
|
+
Requires-Dist: diskcache
|
|
41
|
+
Requires-Dist: colorama
|
|
42
|
+
Requires-Dist: tzdata
|
|
43
|
+
Requires-Dist: click
|
|
44
|
+
Requires-Dist: asgiref>=3.8.1
|
|
45
|
+
Requires-Dist: psutil>=7.0.0
|
|
46
|
+
Requires-Dist: rich>=14.1.0
|
|
47
|
+
Requires-Dist: setproctitle
|
|
48
|
+
Requires-Dist: pyJWT
|
|
49
|
+
Requires-Dist: pynacl
|
|
50
|
+
Dynamic: license-file
|
|
51
|
+
|
|
52
|
+
# Duck Framework
|
|
53
|
+
[](https://www.python.org/downloads/release/python-3100/)
|
|
54
|
+
[](https://github.com/duckframework/duck/stargazers)
|
|
55
|
+
[](https://github.com/duckframework/duck/blob/main/LICENSE)
|
|
56
|
+
[](https://github.com/duckframework/duck/actions)
|
|
57
|
+
[](https://github.com/duckframework/duck/issues)
|
|
58
|
+
[](https://github.com/duckframework/duck/graphs/contributors)
|
|
59
|
+
[](#)
|
|
60
|
+
[](#)
|
|
61
|
+
[](#)
|
|
62
|
+
[](#)
|
|
63
|
+
[](#)
|
|
64
|
+
[](#)
|
|
65
|
+
[](#)
|
|
66
|
+
[](#)
|
|
67
|
+
[](#)
|
|
68
|
+
[](#)
|
|
69
|
+
[](#)
|
|
70
|
+
[](#)
|
|
71
|
+
|
|
72
|
+
**Duck Framework** is an open-source Python web framework and web server with built-in reactive UI and real-time WebSocket support. Build high-performance, scalable, server-side reactive web applications — without separate frontend frameworks or complex JavaScript stacks.
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## Real world apps built with Duck framework:
|
|
77
|
+
|
|
78
|
+
1. [Snip - URL Shortener](https://snip.duckframework.com)
|
|
79
|
+
2. [Quill - AI Design Generator](https://quill.duckframework.com)
|
|
80
|
+
3. [Counter - Simple Counter App](https://duckframework.com/counterapp)
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Duck simplifies web development with:
|
|
85
|
+
|
|
86
|
+
1. [**Built-in HTTPS support**](https://docs.duckframework.com/main/https-and-http2) for secure connections
|
|
87
|
+
2. **Native HTTP/2 support** with **HTTP/1** backward compatibility [link](https://docs.duckframework.com/main/https-and-http2)
|
|
88
|
+
3. Hassle-free **free SSL certificate generation** with **automatic renewal** [link](https://docs.duckframework.com/main/free-ssl-certificate)
|
|
89
|
+
4. [**Lively Component System**](https://docs.duckframework.com/main/lively-components) — with `VDom Diffing` (support for fast UI's)
|
|
90
|
+
5. [**WebSocket support**](https://docs.duckframework.com/main/websocket) — modern websocket implementation with `per-message compression`.
|
|
91
|
+
6. Built-in [task automation](https://docs.duckframework.com/main/automations) — no need for [cron jobs](https://en.m.wikipedia.org/wiki/Cron)
|
|
92
|
+
7. Automatic **content compression** using `gzip`, `deflate` or `brotli`
|
|
93
|
+
8. Support for **chunked transfer encoding**
|
|
94
|
+
9. Easy integration with existing **Django** projects using [`django-add`](https://docs.duckframework.com/main/django-integration) command.
|
|
95
|
+
10. Organized routing with **Duck** [`Blueprints`](https://docs.duckframework.com/main/blueprint)
|
|
96
|
+
11. Full support for **async views** or asynchronous code even in [`WSGI`](https://docs.duckframework.com/main/wsgi) environment
|
|
97
|
+
12. Dynamic project generation with `makeproject` (`mini`, `normal`, or `full`)
|
|
98
|
+
13. Runs on both [`WSGI`](https://docs.duckframework.com/main/wsgi) and [`ASGI`](https://docs.duckframework.com/main/asgi) environments, can even run `async` protocols like `HTTP/2` or `WebSockets` on `WSGI`.
|
|
99
|
+
14. High-performance with low-latency response times
|
|
100
|
+
15. **Resumable downloads** for large files
|
|
101
|
+
16. Protection against **DoS**, **SQL Injection**, **Command Injection**, and other threats
|
|
102
|
+
17. **Auto-reload** in debug mode for rapid development
|
|
103
|
+
18. [**Free production SSL**](https://docs.duckframework.com/main/free-ssl-certificate) — no certificate costs
|
|
104
|
+
19. **Automatic SSL renewal** using `certbot` plus Duck automation system
|
|
105
|
+
20. Comes with built-in web development tools and helpers
|
|
106
|
+
21. [Log management](https://docs.duckframework.com/main/logging) with `duck logs` and file-based logging by default
|
|
107
|
+
22. Real-time [system monitoring](https://docs.duckframework.com/main/monitoring) for CPU, RAM, Disk usage, and I/O activity with `duck monitor`
|
|
108
|
+
23. Easily generate app sitemap using command [`duck sitemap`](https://docs.duckframework.com/main/sitemap) or just use
|
|
109
|
+
the builtin blueprint [`duck.etc.apps.essentials.blueprint.Sitemap`](https://docs.duckframework.com/main/sitemap) for dynamic cached sitemap serving.
|
|
110
|
+
24. Comes with independant [micro applications](https://docs.duckframework.com/main/microapps) which runs on their own servers for micro services support.
|
|
111
|
+
25. Highly **customizable** to fit any use case
|
|
112
|
+
|
|
113
|
+
And more — see [feature list](https://duckframework.com/features)
|
|
114
|
+
|
|
115
|
+
## Upcoming Features
|
|
116
|
+
|
|
117
|
+
1. **HTTP/3 with QUIC** – Faster, modern transport for improved performance.
|
|
118
|
+
2. **QUIC WebTransport** – A next-gen alternative to WebSockets for real-time communication.
|
|
119
|
+
3. **Component Pre-rendering System** – A system to preload components in the background thread to reduce initial load times of component trees.
|
|
120
|
+
4. **Customizable Dashboards** – Tailor interfaces to your workflow and preferences.
|
|
121
|
+
5. **MQTT (Message Queuing Telementry Transport) Integration** – Run your own broker and manage IoT devices with ease.
|
|
122
|
+
6. **Duck WebApp to APK** – Easily convert a Duck web application to APK.
|
|
123
|
+
7. **DuckSight Hot Reload** – Instead of full reload on file changes, implement **hot reload** for the **DuckSight Reloader**. This is faster and efficient than full reload.
|
|
124
|
+
8. **Internal Updates** – Implement logic for listing and securely applying updates when available, utilizing cryptographic code signing (using standards like TUF) to verify GitHub-sourced updates, protecting against rollbacks, and man-in-the-middle exploits.
|
|
125
|
+
9. ~~**Worker Processes** – Use of worker processes to utilize all available CPU cores for improved request handling.~~
|
|
126
|
+
10. **Complete Reverse Proxy Server** – **Duck** only acts as reverse proxy for Django only. Need to make Duck a full-fledged reverse proxy server with optional sticky sessions.
|
|
127
|
+
11. ~~**Component Mutation Observer** – Need to build an optional component mutation observer for keeping track of child changes for fastest re-render (approx. 75x fast on unchanged children).~~
|
|
128
|
+
12. **MCP (Model Context Protocol) Server** – Need to make it easy for creating MCP servers for easy AI communication.
|
|
129
|
+
13. **JWT (JSON-based Web Token) Authentication** – Need to add JWT authentication persistent logins.
|
|
130
|
+
14. **...and more** – [Request a feature](./feature_request.md)
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 🦆 Fun Facts
|
|
135
|
+
|
|
136
|
+
- The **Duck** official website is powered by the **Duck** framework itself—showcasing a true "dogfooding" approach!
|
|
137
|
+
- [**Duck's Lively components**](https://docs.duckframework.com/main/lively-components) bring you a **Lively UI** that's exceptionally fast and responsive, eliminating slow page re-rendering for a seamless user experience.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## AI Assistance
|
|
142
|
+
|
|
143
|
+
All AI-assisted functionality is grouped under the `ai` directory in the root of this repository.
|
|
144
|
+
|
|
145
|
+
This directory includes:
|
|
146
|
+
- AI integration logic
|
|
147
|
+
- Supporting utilities and helpers
|
|
148
|
+
- Configuration and usage examples
|
|
149
|
+
|
|
150
|
+
Refer to it for a deeper understanding of how AI is incorporated into the project.
|
|
151
|
+
|
|
152
|
+
### Vibe Coding
|
|
153
|
+
|
|
154
|
+
When vibe-coding, point your AI assistant to the ai directory in the root repository, or provide its files directly for best results.
|
|
155
|
+
|
|
156
|
+
**Example prompts:**
|
|
157
|
+
```
|
|
158
|
+
Using the guidelines in the `ai` directory of https://github.com/duckframework/duck, create a project named `xyz`.
|
|
159
|
+
Using the guidelines in the `ai` directory of https://github.com/duckframework/duck, improve my project `xyz`.
|
|
160
|
+
Using the guidelines in the `ai` directory of https://github.com/duckframework/duck, improve my project UI — make it modern and beautiful.
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Getting Started
|
|
166
|
+
|
|
167
|
+
**Install latest version from Github using:**
|
|
168
|
+
|
|
169
|
+
```sh
|
|
170
|
+
pip install git+https://github.com/duckframework/duck.git
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**Or install from `PyPi` using:**
|
|
174
|
+
|
|
175
|
+
```sh
|
|
176
|
+
pip install duckframework
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
181
|
+
## Project Creation
|
|
182
|
+
|
|
183
|
+
```sh
|
|
184
|
+
duck makeproject myproject
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
This creates a `normal` project named `myproject`. You can also create other project types using:
|
|
188
|
+
|
|
189
|
+
- `--full` for a full-featured project
|
|
190
|
+
- `--mini` for a simplified starter project
|
|
191
|
+
|
|
192
|
+
### Full Project
|
|
193
|
+
|
|
194
|
+
The full version includes everything **Duck** offers. Recommended for experienced developers.
|
|
195
|
+
|
|
196
|
+
```sh
|
|
197
|
+
duck makeproject myproject --full
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Mini Project
|
|
201
|
+
|
|
202
|
+
Beginner-friendly. Lightweight version with essential functionality.
|
|
203
|
+
|
|
204
|
+
```sh
|
|
205
|
+
duck makeproject myproject --mini
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Simple Startup
|
|
211
|
+
|
|
212
|
+
```sh
|
|
213
|
+
duck makeproject myproject
|
|
214
|
+
cd myproject
|
|
215
|
+
duck runserver # or: python3 web/main.py
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
This starts the server at **http://localhost:8000**
|
|
219
|
+
|
|
220
|
+
**Duck** serves a basic site by default — explore more at [Documentation](https://docs.duckframework.com/main)
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## Understanding the Project
|
|
225
|
+
|
|
226
|
+
Duck generates a set of files and directories as you build your application. This section walks through the core ones you'll interact with most.
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
### `web/main.py`
|
|
231
|
+
|
|
232
|
+
The entry point for your Duck application. You can run it directly with `python web/main.py`, or use the `duck runserver` command instead.
|
|
233
|
+
|
|
234
|
+
```py
|
|
235
|
+
#!/usr/bin/env python
|
|
236
|
+
"""
|
|
237
|
+
Main script for creating and running the Duck application.
|
|
238
|
+
"""
|
|
239
|
+
|
|
240
|
+
from duck.app import App
|
|
241
|
+
|
|
242
|
+
app = App(port=8000, addr="0.0.0.0", domain="localhost")
|
|
243
|
+
|
|
244
|
+
if __name__ == "__main__":
|
|
245
|
+
app.run()
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
### `web/urls.py`
|
|
251
|
+
|
|
252
|
+
Defines the URL routes for your application. Each route maps a static or dynamic path to a **view** — a callable that handles incoming requests for that path.
|
|
253
|
+
|
|
254
|
+
By default, `urlpatterns` is an empty list. Add your own routes to wire up the app.
|
|
255
|
+
|
|
256
|
+
**HTTP route example:**
|
|
257
|
+
|
|
258
|
+
```py
|
|
259
|
+
from duck.urls import path
|
|
260
|
+
from duck.http.response import HttpResponse
|
|
261
|
+
|
|
262
|
+
def home(request):
|
|
263
|
+
return HttpResponse("Hello world")
|
|
264
|
+
|
|
265
|
+
urlpatterns = [
|
|
266
|
+
path('/', home, name="home"),
|
|
267
|
+
]
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
**WebSocket route example:**
|
|
271
|
+
|
|
272
|
+
```py
|
|
273
|
+
from duck.urls import path
|
|
274
|
+
from duck.contrib.websockets import WebSocketView
|
|
275
|
+
|
|
276
|
+
class SomeWebSocket(WebSocketView):
|
|
277
|
+
async def on_receive(self, data: bytes, opcode):
|
|
278
|
+
# Handle incoming WebSocket data
|
|
279
|
+
await self.send_text("Some text")
|
|
280
|
+
|
|
281
|
+
# Other available send methods:
|
|
282
|
+
# send_json, send_binary, send_ping, send_pong, send_close
|
|
283
|
+
|
|
284
|
+
urlpatterns = [
|
|
285
|
+
path('/some_endpoint', SomeWebSocket, name="some_ws_endpoint"),
|
|
286
|
+
]
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
### `web/views.py`
|
|
292
|
+
|
|
293
|
+
An optional file for organising your view functions. Import it as a module in `urls.py` to keep your routes clean.
|
|
294
|
+
|
|
295
|
+
```py
|
|
296
|
+
# web/urls.py
|
|
297
|
+
from duck.urls import path
|
|
298
|
+
from . import views
|
|
299
|
+
|
|
300
|
+
urlpatterns = [
|
|
301
|
+
path('/', views.home, name="home"),
|
|
302
|
+
]
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
### `web/ui/`
|
|
308
|
+
|
|
309
|
+
Contains all frontend logic — components, pages, templates, and static files.
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
#### `web/ui/pages/`
|
|
314
|
+
|
|
315
|
+
Duck recommends building UI with **Pages** — Python classes that represent full HTML pages. Pages unlock the [Lively Component System](https://docs.duckframework.com/main/lively-components), which enables fast navigation and real-time interactivity without JavaScript or full page reloads.
|
|
316
|
+
|
|
317
|
+
**What is an HTML Component?**
|
|
318
|
+
|
|
319
|
+
A component is a Python class that represents an HTML element. You configure it with props and style, then render it to HTML.
|
|
320
|
+
|
|
321
|
+
```py
|
|
322
|
+
from duck.html.components import InnerComponent
|
|
323
|
+
|
|
324
|
+
class Button(InnerComponent):
|
|
325
|
+
def get_element(self):
|
|
326
|
+
return "button"
|
|
327
|
+
|
|
328
|
+
btn = Button(text="Hello world")
|
|
329
|
+
|
|
330
|
+
print(btn.render()) # <button>Hello world</button>
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
Duck ships with many built-in components — `Button`, `Navbar`, `Modal`, `Input`, and more — available under `duck.html.components`.
|
|
334
|
+
|
|
335
|
+
**Creating Pages**
|
|
336
|
+
|
|
337
|
+
Subclass `duck.html.components.page.Page` to create a page. The recommended pattern is a `BasePage` that defines the shared layout, with individual pages overriding only what they need.
|
|
338
|
+
|
|
339
|
+
```py
|
|
340
|
+
# web/ui/pages/base.py
|
|
341
|
+
from duck.html.components.container import FlexContainer
|
|
342
|
+
from duck.html.components.page import Page
|
|
343
|
+
|
|
344
|
+
class BasePage(Page):
|
|
345
|
+
def on_create(self):
|
|
346
|
+
super().on_create()
|
|
347
|
+
self.set_title("MySite")
|
|
348
|
+
self.set_description("Some base description ...")
|
|
349
|
+
|
|
350
|
+
# Set up the root layout container
|
|
351
|
+
self.main = FlexContainer(flex_direction="column")
|
|
352
|
+
self.add_to_body(self.main)
|
|
353
|
+
|
|
354
|
+
self.build_layout(self.main)
|
|
355
|
+
|
|
356
|
+
def build_layout(self, main):
|
|
357
|
+
# Override in subclasses to define page-specific layout
|
|
358
|
+
pass
|
|
359
|
+
```
|
|
360
|
+
|
|
361
|
+
```py
|
|
362
|
+
# web/ui/pages/home.py
|
|
363
|
+
from duck.html.components.container import Container
|
|
364
|
+
from web.ui.pages.base import BasePage
|
|
365
|
+
|
|
366
|
+
class HomePage(BasePage):
|
|
367
|
+
def build_layout(self, main):
|
|
368
|
+
main.add_child(Container(text="Hello world"))
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
**Using Pages in views:**
|
|
372
|
+
|
|
373
|
+
```py
|
|
374
|
+
# web/views.py
|
|
375
|
+
from duck.shortcuts import to_response
|
|
376
|
+
|
|
377
|
+
def home(request):
|
|
378
|
+
return to_response(HomePage(request))
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
> Pages automatically enable fast client-side navigation via Lively. Unlike templates, switching between pages does not trigger a full reload.
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
#### `web/ui/components/`
|
|
386
|
+
|
|
387
|
+
Where your custom reusable components live. The example below shows a feedback form with real-time UI updates powered by Lively.
|
|
388
|
+
|
|
389
|
+
```py
|
|
390
|
+
# web/ui/components/form.py
|
|
391
|
+
from duck.html.components.form import Form
|
|
392
|
+
from duck.html.components.input import Input, InputWithLabel
|
|
393
|
+
from duck.html.components.textarea import TextArea
|
|
394
|
+
from duck.html.components.button import Button
|
|
395
|
+
from duck.html.components.label import Label
|
|
396
|
+
|
|
397
|
+
class MyFeedbackForm(Form):
|
|
398
|
+
def on_create(self):
|
|
399
|
+
super().on_create()
|
|
400
|
+
|
|
401
|
+
# Status label for displaying feedback or errors
|
|
402
|
+
self.label = Label(text="")
|
|
403
|
+
|
|
404
|
+
self.add_children([
|
|
405
|
+
self.label,
|
|
406
|
+
InputWithLabel(
|
|
407
|
+
label_text="Your name",
|
|
408
|
+
input=Input(name="name", type="text", placeholder="Enter your name", required=True),
|
|
409
|
+
),
|
|
410
|
+
InputWithLabel(
|
|
411
|
+
label_text="Your message",
|
|
412
|
+
input=TextArea(name="message", placeholder="Your message", required=True),
|
|
413
|
+
),
|
|
414
|
+
Button(text="Submit", props={"type": "submit"}),
|
|
415
|
+
])
|
|
416
|
+
|
|
417
|
+
# Bind submit event — update_targets lists components to re-render on the client
|
|
418
|
+
self.bind("submit", self.on_form_submit, update_self=True, update_targets=[self.label])
|
|
419
|
+
|
|
420
|
+
async def on_form_submit(self, form, event, form_inputs, ws):
|
|
421
|
+
name = form_inputs.get("name").strip()
|
|
422
|
+
message = form_inputs.get("message").strip()
|
|
423
|
+
|
|
424
|
+
# Validate and persist the message here
|
|
425
|
+
|
|
426
|
+
# Patch the label in-place on the client
|
|
427
|
+
self.label.text = "Your message has been received"
|
|
428
|
+
self.label.color = "green"
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
---
|
|
432
|
+
|
|
433
|
+
#### `web/ui/templates/`
|
|
434
|
+
|
|
435
|
+
Prefer classic server-rendered templates? Store them here. Duck supports both **Django** and **Jinja2** template engines.
|
|
436
|
+
|
|
437
|
+
```django
|
|
438
|
+
{# web/ui/templates/home.html #}
|
|
439
|
+
{% extends 'base.html' %}
|
|
440
|
+
|
|
441
|
+
{% block main %}
|
|
442
|
+
Hello world!
|
|
443
|
+
{% endblock main %}
|
|
444
|
+
```
|
|
445
|
+
|
|
446
|
+
```py
|
|
447
|
+
# web/views.py
|
|
448
|
+
from duck.shortcuts import render, async_render
|
|
449
|
+
|
|
450
|
+
def home(request):
|
|
451
|
+
return render("home.html", engine="django") # or engine="jinja2"
|
|
452
|
+
|
|
453
|
+
async def async_home(request):
|
|
454
|
+
return await async_render("home.html", engine="django")
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
> You can also use HTML components inside templates. See [Lively Components](https://docs.duckframework.com/main/lively-components) for details.
|
|
458
|
+
|
|
459
|
+
#### `web/ui/static/`
|
|
460
|
+
|
|
461
|
+
This directory contains all the static files like css/js files, images or videos for your application.
|
|
462
|
+
|
|
463
|
+
> Instead of hard-coding static file URLs in components or templates, use the `static` function in `duck.shortcuts` module.
|
|
464
|
+
|
|
465
|
+
```py
|
|
466
|
+
# views.py
|
|
467
|
+
from duck.shortcuts import static
|
|
468
|
+
|
|
469
|
+
def home(request):
|
|
470
|
+
# Instead of:
|
|
471
|
+
my_image_url = "/static/images/my-image.png"
|
|
472
|
+
|
|
473
|
+
# Do this instead:
|
|
474
|
+
my_image_url = static("images/my-image.png")
|
|
475
|
+
|
|
476
|
+
return "Hello world" # Anything here.
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
> The same applies with hard-coding internal URLs, use the `resolve()` function in `duck.shortcuts`.
|
|
480
|
+
|
|
481
|
+
---
|
|
482
|
+
|
|
483
|
+
## Django Integration
|
|
484
|
+
|
|
485
|
+
If you have an existing **Django** project and want production features like **HTTPS**, **HTTP/2**, and **resumable downloads**, Duck makes it easy.
|
|
486
|
+
|
|
487
|
+
Unlike `nginx` setups, **Duck** simplifies this with a few commands.
|
|
488
|
+
|
|
489
|
+
### Benefits
|
|
490
|
+
|
|
491
|
+
- Native [HTTP/2 & HTTPS](https://docs.duckframework.com/main/https-and-http2) implementation.
|
|
492
|
+
- Extra built-in security [middleware](https://docs.duckframework.com/main/middlewares) (DoS, SQLi, etc.)
|
|
493
|
+
- Duck and Django run in the same Python environment (faster communication)
|
|
494
|
+
- Auto-compressed responses
|
|
495
|
+
- Resumable large downloads
|
|
496
|
+
- Fast and [Reactive Lively components](https://docs.duckframework.com/main/lively-components) - for beautiful & responsive UI.
|
|
497
|
+
- [Free SSL with renewal](https://docs.duckframework.com/main/free-ssl-certificate)
|
|
498
|
+
- and more
|
|
499
|
+
|
|
500
|
+
### Usage
|
|
501
|
+
|
|
502
|
+
```sh
|
|
503
|
+
duck makeproject myproject
|
|
504
|
+
cd myproject
|
|
505
|
+
duck django-add "path/to/your/django_project"
|
|
506
|
+
duck runserver -dj
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
### Notes:
|
|
510
|
+
|
|
511
|
+
- Follow instructions provided by `django-add` command carefully
|
|
512
|
+
- Make sure your Django project defines at least one `urlpattern`
|
|
513
|
+
- Once setup, you’re good to go!
|
|
514
|
+
|
|
515
|
+
---
|
|
516
|
+
|
|
517
|
+
## Useful Links
|
|
518
|
+
|
|
519
|
+
1. [Official Website](https://duckframework.com)
|
|
520
|
+
2. [Documentation](https://docs.duckframework.com)
|
|
521
|
+
3. [Lively UI Documentation](https://docs.duckframework.com/main/lively-components)
|
|
522
|
+
|
|
523
|
+
---
|
|
524
|
+
|
|
525
|
+
## 🚀 Premium Duck Components Coming Soon!
|
|
526
|
+
>
|
|
527
|
+
> All our UI components are currently free and open source. Stay tuned for upcoming Pro Packs featuring advanced dashboards, e-commerce, and integrations!
|
|
528
|
+
>
|
|
529
|
+
> ⭐ Star this repo to get notified on release!
|
|
530
|
+
|
|
531
|
+
|
|
532
|
+
## Contributing & Issues
|
|
533
|
+
|
|
534
|
+
**Duck** is open to all forms of contribution — financial or technical.
|
|
535
|
+
|
|
536
|
+
### Sponsorship/Donations:
|
|
537
|
+
|
|
538
|
+
Support development on [Patreon](https://patreon.com/duckframework)
|
|
539
|
+
|
|
540
|
+
### Report issues:
|
|
541
|
+
|
|
542
|
+
Use the [GitHub Issues page](https://github.com/duckframework/duck/issues)
|
|
543
|
+
|
|
544
|
+
---
|
|
545
|
+
|
|
546
|
+
> **Duck is updated regularly** — check the repo for improvements and bug fixes.
|