pyramid_cubicweb/handler.py
author Christophe de Vienne <christophe@unlish.com>
Wed, 09 Jul 2014 17:14:32 +0200
changeset 11484 39768d122f97
child 11485 3905c9f06d0e
permissions -rw-r--r--
Isolate the default handler and extend its role The handler now does the job of CubicWebPublisher.main_handle_request() and calls CubicWebPublisher.core_handle(). Instead of using config.add_notfound_view, a catchall route is defined and the handler plugged to it. Related to #4291173
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11484
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     1
from pyramid import security
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     2
from pyramid.httpexceptions import HTTPSeeOther
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     3
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     4
from cubicweb.web.application import CubicWebPublisher
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     5
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     6
from cubicweb.web import (
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     7
    StatusResponse, DirectResponse, Redirect, NotFound, LogOut,
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     8
    RemoteCallFailed, InvalidSession, RequestError, PublishException)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
     9
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    10
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    11
class PyramidSessionHandler(object):
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    12
    """A CW Session handler that rely on the pyramid API to fetch the needed
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    13
    informations"""
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    14
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    15
    def __init__(self, appli):
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    16
        self.appli = appli
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    17
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    18
    def get_session(self, req):
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    19
        return req._request.cw_session
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    20
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    21
    def logout(self, req, goto_url):
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    22
        raise LogOut(url=goto_url)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    23
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    24
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    25
class CubicWebPyramidHandler(object):
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    26
    def __init__(self, appli):
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    27
        self.appli = appli
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    28
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    29
    def __call__(self, request):
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    30
        """
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    31
        Handler that mimics what CubicWebPublisher.main_handle_request does and
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    32
        call CubicWebPyramidHandler.core_handle.
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    33
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    34
        """
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    35
        # XXX In a later version of this handler, we need to by-pass
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    36
        # core_handle and CubicWebPublisher altogether so that the various CW
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    37
        # exceptions are converted to their pyramid equivalent.
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    38
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    39
        req = request.cw_request()
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    40
        req.set_cnx(request.cw_cnx)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    41
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    42
        # XXX The main handler of CW forbid anonymous https connections
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    43
        # I guess we can drop this "feature" but in doubt I leave this comment
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    44
        # so we don't forget about it. (cdevienne)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    45
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    46
        try:
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    47
            content = self.appli.core_handle(req, req.path)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    48
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    49
            if content is not None:
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    50
                request.response.body = content
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    51
            request.response.headers.clear()
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    52
            for k, v in req.headers_out.getAllRawHeaders():
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    53
                for item in v:
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    54
                    request.response.headers.add(k, item)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    55
        except LogOut as ex:
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    56
            # The actual 'logging out' logic should be in separated function
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    57
            # that is accessible by the pyramid views
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    58
            del req._request.session['cubicweb.sessionid']
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    59
            if not req.session.closed:
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    60
                req.session.repo.close(req.session.sessionid)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    61
            headers = security.forget(request)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    62
            raise HTTPSeeOther(ex.url, headers=headers)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    63
        except Redirect as ex:
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    64
            raise HTTPSeeOther(ex.url)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    65
        # except AuthenticationError:
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    66
        # XXX I don't think it makes sens to catch this ex here (cdevienne)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    67
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    68
        return request.response
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    69
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    70
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    71
def includeme(config):
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    72
    # Set up a defaut route to handle non-catched urls.
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    73
    # This is to keep legacy compatibility for cubes that makes use of the
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    74
    # cubicweb controllers.
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    75
    cwconfig = config.registry['cubicweb.config']
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    76
    repository = config.registry['cubicweb.repository']
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    77
    cwappli = CubicWebPublisher(
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    78
        repository, cwconfig,
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    79
        session_handler_fact=PyramidSessionHandler)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    80
    handler = CubicWebPyramidHandler(cwappli)
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    81
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    82
    config.registry['cubicweb.appli'] = cwappli
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    83
    config.registry['cubicweb.handler'] = handler
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    84
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    85
    config.add_route('catchall', pattern='*path')
39768d122f97 Isolate the default handler and extend its role
Christophe de Vienne <christophe@unlish.com>
parents:
diff changeset
    86
    config.add_view(handler, route_name='catchall')