ZODB middleware
This is my attempt to ZODB middleware. It is my first middleware so it is'nt perfect:) Any suggestions are welcome.
(I've started extracting this into a separate project, even though a very small project: https://svn.openplans.org/svn/ZODBMiddleware/trunk -- Ian Bicking)
This is tested with Zope3 fresh installation.
Lets create dir with middleware: zodb/wsgi_middleware.py
from ZODB import FileStorage, DB
import transaction
class ZODBMiddleware:
def __init__(self, app, app_conf):
self.app = app
storage = FileStorage.FileStorage(app_conf['zodb.file'])
self.db = DB(storage)
def __call__(self, environ, start_response):
environ['zodb.connection'] = self.db.open()
environ['zodb.root'] = environ['zodb.connection'].root()
environ['zodb.db'] = self.db
res = self.app(environ, start_response)
transaction.get().commit()
environ['zodb.connection'].close()
return res
and then create model: models/employee.py
from persistent import Persistent
class Employee(Persistent):
def __init__(self, name):
self.name = name
class EmployeeKeeper(Persistent):
def __init__(self):
self.employees = []
def add_employee(self, emp):
self.employees.append(emp)
self._p_changed = 1
self._p_changed = 1 is needed because zodb must know that mutable was change.
and in models/init.py:
from employee import Employee from employee import EmployeeKeeper
And simple controller: controllers/sample.py
from newproject.lib.base import *
class SampleController(BaseController):
def index(self):
root = request.environ['zodb.root']
if not root.get('company'):
root['company'] = model.EmployeeKeeper()
root['company'].add_employee(model.Employee("Some name"))
return Response(["%s <br />" % emp.name for emp in root['company'].employees])
We must turn on middleware in middleware.py:
... from newproject.zodb.wsgi_middleware import ZODBMiddleware ... app = ZODBMiddleware(app, app_conf) ...
That's all. DjangoMiddleware? coming soon.