summaryrefslogtreecommitdiff
path: root/docs/narr/urldispatch.rst
diff options
context:
space:
mode:
authorChris McDonough <chrism@agendaless.com>2009-05-10 22:13:25 +0000
committerChris McDonough <chrism@agendaless.com>2009-05-10 22:13:25 +0000
commitb1908e63dce0a620806aa599a149ea2e8b4b9c2b (patch)
tree69ce2ad2de5fac2dbc00febf3679336d8660cc2e /docs/narr/urldispatch.rst
parent277df8ebad5b9c6a3f45618354d7c3c96f55e247 (diff)
downloadpyramid-b1908e63dce0a620806aa599a149ea2e8b4b9c2b.tar.gz
pyramid-b1908e63dce0a620806aa599a149ea2e8b4b9c2b.tar.bz2
pyramid-b1908e63dce0a620806aa599a149ea2e8b4b9c2b.zip
- Added documentation to the URL Dispatch chapter about how to perform
a cleanup function at the end of a request (e.g. close the SQL connection).
Diffstat (limited to 'docs/narr/urldispatch.rst')
-rw-r--r--docs/narr/urldispatch.rst43
1 files changed, 43 insertions, 0 deletions
diff --git a/docs/narr/urldispatch.rst b/docs/narr/urldispatch.rst
index 7c2c71ad0..b53292d2f 100644
--- a/docs/narr/urldispatch.rst
+++ b/docs/narr/urldispatch.rst
@@ -378,6 +378,49 @@ declaration:
view_name="root_view"
/>
+Cleaning Up After a Request
+---------------------------
+
+Often it's required that some cleanup be performed at the end of a
+request when a database connection is involved. When
+:term:`traversal` is used, this cleanup is often done as a side effect
+of the traversal :term:`root factory`. Often the root factory will
+insert an object into the WSGI environment that performs some cleanup
+when its ``__del__`` method is called. When URL dispatch is used,
+however, no root factory is required, so sometimes that option is not
+open to you.
+
+Instead of putting this cleanup logic in the root factory, however,
+you can cause a subscriber to be fired when a new request is detected;
+the subscriber can do this work. For example, let's say you have a
+``mypackage`` BFG package that uses SQLAlchemy, and you'd like the
+current SQLAlchemy database session to be removed after each request.
+Put the following in the ``mypackage.run`` module:
+
+.. code-block:: python
+
+ from mypackage.sql import DBSession
+
+ class Cleanup:
+ def __init__(self, cleaner):
+ self.cleaner = cleaner
+ def __del__(self):
+ self.cleaner()
+
+ def handle_teardown(event):
+ environ = event.request.environ
+ environ['mypackage.sqlcleaner'] = Cleanup(DBSession.remove)
+
+Then in the ``configure.zcml`` of your package, inject the following:
+
+.. code-block:: xml
+
+ <subscriber for="repoze.bfg.interfaces.INewRequest"
+ handler="mypackage.run.handle_teardown"/>
+
+This will cause the DBSession to be removed whenever the WSGI
+environment is destroyed (usually at the end of every request).
+
Using :mod:`repoze.bfg` Security With URL Dispatch
--------------------------------------------------