datasette/docs
Simon Willison 80b7f987ca
write_wrapper plugin hook for intercepting write operations (#2636)
* Implement write_wrapper plugin hook for intercepting database writes

Add a new `write_wrapper` plugin hook that lets plugins wrap write
operations with before/after logic using a generator-based context
manager pattern. The hook receives (datasette, database, request,
transaction) and returns a generator function that takes a conn,
yields once to let the write execute, and can run cleanup after.

The write result is sent back via `generator.send()` and exceptions
are thrown via `generator.throw()`, giving plugins full visibility.

Also adds `request=None` parameter to execute_write, execute_write_fn,
execute_write_script, and execute_write_many, and threads request
through all view-layer call sites (insert, upsert, update, delete,
drop, create table, canned queries).

* Add documentation for wrap_write hook, fix lint issues

Document the wrap_write plugin hook in plugin_hooks.rst with
parameter descriptions and two examples: a simple logging wrapper
and an advanced SQLite authorizer-based table protection pattern.

Also fix black formatting and remove unused variable flagged by ruff.

* Rename wrap_write hook to write_wrapper for consistency with asgi_wrapper
* Move write_wrapper docs to just below prepare_connection
* Refactor write_wrapper tests to use pytest.parametrize

Consolidate duplicate test cases: merge before/after tests for
execute_write_fn and execute_write into one parametrized test, and
merge three parameter-passing tests into one parametrized test.

Claude Code transcript: https://gisthost.github.io/?c4c12079434e69677e4aa8ac664b21b8/index.html
2026-02-09 13:20:33 -08:00
..
_static Add favicon to documentation (#1967) 2022-12-31 11:00:31 -08:00
_templates Drop jQuery dependency 2023-03-26 16:38:58 -07:00
.gitignore Added initial docs, including a changelog 2017-11-16 07:11:00 -08:00
authentication.rst datasette serve --default-deny option (#2593) 2025-11-12 16:14:21 -08:00
auto-build.sh Added --load-extension argument to datasette serve 2017-11-16 08:48:49 -08:00
binary_data.rst Use shot-scraper images from datasette-screenshots repo, closes #1844 2022-10-14 12:57:00 -07:00
changelog.rst Release 1.0a24 2026-01-29 09:00:22 -08:00
cli-reference.rst datasette serve --default-deny option (#2593) 2025-11-12 16:14:21 -08:00
codespell-ignore-words.txt Move Metadata to --internal database 2024-06-11 09:33:23 -07:00
conf.py Enable MyST Markdown docs, port events.rst, refs #2565 2025-10-31 16:38:04 -07:00
configuration.rst Configuration via the command-line section 2024-02-05 13:43:50 -08:00
contributing.rst dependency-groups and uv (#2611) 2025-12-11 17:32:58 -08:00
csv_export.rst Use shot-scraper images from datasette-screenshots repo, closes #1844 2022-10-14 12:57:00 -07:00
custom_templates.rst New .core CSS class for inputs and buttons 2024-09-03 08:37:26 -07:00
datasette-0.51.png Release 0.51 2020-10-31 15:21:49 -07:00
datasette-logo.svg Added new logo to the documentation 2020-07-12 12:53:29 -07:00
deploying.rst Add test for RST heading underline lengths, closes #2544 2025-10-26 09:49:49 -07:00
ecosystem.rst Shrunk ecosystem docs in favour of datasette.io, closes #1182 2021-01-09 14:17:18 -08:00
events.md Enable MyST Markdown docs, port events.rst, refs #2565 2025-10-31 16:38:04 -07:00
facets.rst Move non-metadata configuration from metadata.yaml to datasette.yaml 2023-10-12 09:16:37 -07:00
full_text_search.rst Move non-metadata configuration from metadata.yaml to datasette.yaml 2023-10-12 09:16:37 -07:00
getting_started.rst Replace Glitch with Codespaces, closes #2488 2025-05-28 19:17:22 -07:00
index.rst Removed broken refs to Glitch, closes #2503 2025-09-28 21:15:58 -07:00
installation.rst Python 3.14, drop Python 3.9 2025-10-08 13:11:32 -07:00
internals.rst Add request.form() for multipart form data and file uploads 2026-01-28 18:41:03 -08:00
introspection.rst Implement resource-based permission system with SQL-driven access control 2025-10-24 10:32:18 -07:00
javascript_plugins.rst JavaScript plugins documentation, closes #2250 2024-02-05 11:47:17 -08:00
json_api.rst Fixed some rST labels I broke 2025-10-31 09:15:39 -07:00
Makefile Added documentation on the Datasette Ecosystem 2019-01-31 19:36:07 -08:00
metadata.rst Removed units functionality and Pint dependency 2024-08-20 19:03:33 -07:00
metadata_doc.py Rename metadata tables and add schema to docs, refs #2382 2024-08-05 13:53:55 -07:00
pages.rst /-/schema and /db/-/schema and /db/table/-/schema pages (plus .json/.md) 2025-11-07 12:01:23 -08:00
performance.rst Release 0.63a1 2022-10-23 20:07:09 -07:00
plugin_hooks.rst write_wrapper plugin hook for intercepting write operations (#2636) 2026-02-09 13:20:33 -08:00
plugins.rst Ran cog 2025-10-25 15:38:07 -07:00
publish.rst Remove all remaining "$ " prefixes from docs, closes #2140 2023-08-11 10:44:34 -07:00
settings.rst Fix permissions_execute_sql warnings in documentation 2025-11-01 11:52:23 -07:00
spatialite.rst Remove all remaining "$ " prefixes from docs, closes #2140 2023-08-11 10:44:34 -07:00
sql_queries.rst Fix permissions_execute_sql warnings in documentation 2025-11-01 11:52:23 -07:00
testing_plugins.rst datasette.pm property, closes #2595 2025-11-13 10:31:03 -08:00
upgrade-1.0a20.md Fix for link from changelog not working 2025-11-03 14:38:57 -08:00
upgrade_guide.md Fixed some broken reference links on upgrade guide 2025-11-03 14:34:29 -08:00
writing_plugins.rst New .core CSS class for inputs and buttons 2024-09-03 08:37:26 -07:00