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.



Powered by Pylons - Contact Administrators