py-scopes/scopes/server/app.py
2024-03-15 14:51:54 +01:00

50 lines
1.6 KiB
Python

# scopes.server.app
from zope.publisher.base import DefaultPublication
from zope.publisher.browser import BrowserRequest
from zope.publisher.interfaces import NotFound
from zope.publisher.publish import publish
from scopes.interfaces import ITraversable, IView
from scopes.server.browser import getView
import scopes.storage.concept # register container classes
from scopes.storage.folder import Root
def zope_app_factory(config):
storageFactory = config.StorageFactory(config)
def zope_app(environ, start_response):
storage = storageFactory(config.dbschema)
appRoot = Root(storage)
request = BrowserRequest(environ['wsgi.input'], environ)
request.setPublication(Publication(appRoot))
request = publish(request, True)
response = request.response
start_response(response.getStatusString(), response.getHeaders())
return response.consumeBodyIter()
return zope_app
class Publication(DefaultPublication):
def traverseName(self, request, ob, name):
next = getView(request, ob, name)
if next is not None:
return next
if ITraversable.providedBy(ob):
next = ob.get(name)
if next is None:
raise NotFound(ob, name, request)
return next
def getDefaultTraversal(self, request, ob):
if IView.providedBy(ob):
return ob, ()
return ob, ('index.html',)
def handleException(self, ob, request, exc_info, retry_allowed=True):
if exc_info[0] != NotFound:
raise
request.response.reset()
request.response.handleException(exc_info)