cubicweb/pyramid/__init__.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Tue, 21 Feb 2017 08:54:20 +0100
changeset 11968 bb0dfc7d2d0e
parent 11967 83739be20fab
child 11969 2fb941d12d74
permissions -rw-r--r--
[skeleton,pyramid] Move pyramid app definition in cubicweb.pyramid module The application definition is actually not specific to the final "cube" being bootstrapped from skeleton. This patch thus move the pyramid application function into cubicweb.pyramid module and let cubicweb register the "paste.app_factory" entry point (instead of the bootstrapped cube). Useless call to `config.scan` is dropped along the way.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
11967
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
     1
# copyright 2017 LOGILAB S.A. (Paris, FRANCE), all rights reserved.
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
     2
# copyright 2014-2016 UNLISH S.A.S. (Montpellier, FRANCE), all rights reserved.
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
     3
#
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
     4
# contact http://www.logilab.fr/ -- mailto:contact@logilab.fr
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
     5
#
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
     6
# This file is part of CubicWeb.
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
     7
#
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
     8
# CubicWeb is free software: you can redistribute it and/or modify it under the
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
     9
# terms of the GNU Lesser General Public License as published by the Free
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    10
# Software Foundation, either version 2.1 of the License, or (at your option)
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    11
# any later version.
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    12
#
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    13
# CubicWeb is distributed in the hope that it will be useful, but WITHOUT
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    14
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    15
# FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    16
# details.
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    17
#
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    18
# You should have received a copy of the GNU Lesser General Public License along
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    19
# with CubicWeb.  If not, see <http://www.gnu.org/licenses/>.
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    20
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    21
"""Pyramid interface to CubicWeb"""
83739be20fab [pyramid] Add a copyright and docstring to all modules
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11959
diff changeset
    22
11503
ddf61aa73384 Add a wsgi application factory suitable for wsgi servers.
Christophe de Vienne <christophe@unlish.com>
parents: 11501
diff changeset
    23
import os
11563
f9473eb6a8a9 Make debug mode usable without pyramid_debugtoolbar
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11550
diff changeset
    24
from warnings import warn
11511
13e0f569684c Use 'wsgicors' for CORS handling.
Christophe de Vienne <christophe@unlish.com>
parents: 11503
diff changeset
    25
import wsgicors
11503
ddf61aa73384 Add a wsgi application factory suitable for wsgi servers.
Christophe de Vienne <christophe@unlish.com>
parents: 11501
diff changeset
    26
ddf61aa73384 Add a wsgi application factory suitable for wsgi servers.
Christophe de Vienne <christophe@unlish.com>
parents: 11501
diff changeset
    27
from cubicweb.cwconfig import CubicWebConfiguration as cwcfg
11501
fcf7f99fad4a Add a make_cubicweb_application function
Christophe de Vienne <christophe@unlish.com>
parents: 11492
diff changeset
    28
from pyramid.config import Configurator
11534
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    29
from pyramid.settings import asbool, aslist
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    30
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    31
try:
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    32
    from configparser import SafeConfigParser
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    33
except ImportError:
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    34
    from ConfigParser import SafeConfigParser
11501
fcf7f99fad4a Add a make_cubicweb_application function
Christophe de Vienne <christophe@unlish.com>
parents: 11492
diff changeset
    35
fcf7f99fad4a Add a make_cubicweb_application function
Christophe de Vienne <christophe@unlish.com>
parents: 11492
diff changeset
    36
11958
950ce7d9f642 [pyramid] Rename make_cubicweb_application function as config_from_cwconfig
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11811
diff changeset
    37
def config_from_cwconfig(cwconfig, settings=None):
950ce7d9f642 [pyramid] Rename make_cubicweb_application function as config_from_cwconfig
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11811
diff changeset
    38
    """Return a Pyramid Configurator instance built from a CubicWeb config and
950ce7d9f642 [pyramid] Rename make_cubicweb_application function as config_from_cwconfig
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11811
diff changeset
    39
    Pyramid-specific configuration files (pyramid.ini).
11537
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    40
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    41
    :param cwconfig: A CubicWeb configuration
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    42
    :returns: A Pyramid config object
11501
fcf7f99fad4a Add a make_cubicweb_application function
Christophe de Vienne <christophe@unlish.com>
parents: 11492
diff changeset
    43
    """
11620
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    44
    settings = dict(settings) if settings else {}
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    45
    settings.update(settings_from_cwconfig(cwconfig))
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    46
    config = Configurator(settings=settings)
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    47
    config.registry['cubicweb.config'] = cwconfig
11631
faf279e33298 Merge with pyramid-cubicweb
Yann Voté <yann.vote@logilab.fr>
parents: 11623
diff changeset
    48
    config.include('cubicweb.pyramid')
11620
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    49
    return config
11534
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    50
11811
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11702
diff changeset
    51
11620
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    52
def settings_from_cwconfig(cwconfig):
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    53
    '''
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    54
    Extract settings from pyramid.ini and pyramid-debug.ini (if in debug)
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    55
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    56
    Can be used to configure middleware WSGI with settings from pyramid.ini files
11534
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    57
11620
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    58
    :param cwconfig: A CubicWeb configuration
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    59
    :returns: A settings dictionnary
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    60
    '''
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    61
    settings_filenames = [os.path.join(cwconfig.apphome, 'pyramid.ini')]
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    62
    settings = {}
11501
fcf7f99fad4a Add a make_cubicweb_application function
Christophe de Vienne <christophe@unlish.com>
parents: 11492
diff changeset
    63
    if cwconfig.debugmode:
11534
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    64
        settings_filenames.insert(
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    65
            0, os.path.join(cwconfig.apphome, 'pyramid-debug.ini'))
11811
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11702
diff changeset
    66
11501
fcf7f99fad4a Add a make_cubicweb_application function
Christophe de Vienne <christophe@unlish.com>
parents: 11492
diff changeset
    67
        settings.update({
fcf7f99fad4a Add a make_cubicweb_application function
Christophe de Vienne <christophe@unlish.com>
parents: 11492
diff changeset
    68
            'pyramid.debug_authorization': True,
fcf7f99fad4a Add a make_cubicweb_application function
Christophe de Vienne <christophe@unlish.com>
parents: 11492
diff changeset
    69
            'pyramid.debug_notfound': True,
fcf7f99fad4a Add a make_cubicweb_application function
Christophe de Vienne <christophe@unlish.com>
parents: 11492
diff changeset
    70
            'pyramid.debug_routematch': True,
11567
4f8aa5fcd5da [debug] The debug mode now set pyramid.reload_templates
Christophe de Vienne <christophe@unlish.com>
parents: 11564
diff changeset
    71
            'pyramid.reload_templates': True,
11501
fcf7f99fad4a Add a make_cubicweb_application function
Christophe de Vienne <christophe@unlish.com>
parents: 11492
diff changeset
    72
        })
11811
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11702
diff changeset
    73
11534
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    74
    for fname in settings_filenames:
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    75
        if os.path.exists(fname):
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    76
            cp = SafeConfigParser()
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    77
            cp.read(fname)
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    78
            settings.update(cp.items('main'))
ceb1a5baca4f [config] Read pyramid settings in a 'pyramid.ini' file
Christophe de Vienne <christophe@unlish.com>
parents: 11532
diff changeset
    79
            break
11811
f09efeead7f9 Fix broken flake8 configuration
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11702
diff changeset
    80
11620
2497bcf18030 split collecting setting before using them, so the function can be reused when inserting WSGI middlewares
Arthur Lutz <arthur.lutz@logilab.fr>
parents: 11601
diff changeset
    81
    return settings
11503
ddf61aa73384 Add a wsgi application factory suitable for wsgi servers.
Christophe de Vienne <christophe@unlish.com>
parents: 11501
diff changeset
    82
ddf61aa73384 Add a wsgi application factory suitable for wsgi servers.
Christophe de Vienne <christophe@unlish.com>
parents: 11501
diff changeset
    83
11535
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
    84
def wsgi_application_from_cwconfig(
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
    85
        cwconfig,
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
    86
        profile=False, profile_output=None, profile_dump_every=None):
11537
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    87
    """ Build a WSGI application from a cubicweb configuration
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    88
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    89
    :param cwconfig: A CubicWeb configuration
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    90
    :param profile: Enable profiling. See :ref:`profiling`.
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    91
    :param profile_output: Profiling output filename. See :ref:`profiling`.
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    92
    :param profile_dump_every: Profiling number of requests before dumping the
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    93
                               stats. See :ref:`profiling`.
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    94
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    95
    :returns: A fully operationnal WSGI application
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
    96
    """
11958
950ce7d9f642 [pyramid] Rename make_cubicweb_application function as config_from_cwconfig
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11811
diff changeset
    97
    config = config_from_cwconfig(cwconfig)
11535
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
    98
    profile = profile or asbool(config.registry.settings.get(
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
    99
        'cubicweb.profile.enable', False))
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
   100
    if profile:
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
   101
        config.add_route('profile_ping', '_profile/ping')
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
   102
        config.add_route('profile_cnx', '_profile/cnx')
11631
faf279e33298 Merge with pyramid-cubicweb
Yann Voté <yann.vote@logilab.fr>
parents: 11623
diff changeset
   103
        config.scan('cubicweb.pyramid.profile')
11511
13e0f569684c Use 'wsgicors' for CORS handling.
Christophe de Vienne <christophe@unlish.com>
parents: 11503
diff changeset
   104
    app = config.make_wsgi_app()
13e0f569684c Use 'wsgicors' for CORS handling.
Christophe de Vienne <christophe@unlish.com>
parents: 11503
diff changeset
   105
    # This replaces completely web/cors.py, which is not used by
11631
faf279e33298 Merge with pyramid-cubicweb
Yann Voté <yann.vote@logilab.fr>
parents: 11623
diff changeset
   106
    # cubicweb.pyramid anymore
11511
13e0f569684c Use 'wsgicors' for CORS handling.
Christophe de Vienne <christophe@unlish.com>
parents: 11503
diff changeset
   107
    app = wsgicors.CORS(
13e0f569684c Use 'wsgicors' for CORS handling.
Christophe de Vienne <christophe@unlish.com>
parents: 11503
diff changeset
   108
        app,
11532
6a1d0aa3ac85 Fix cors 'origin' parameter passing
Christophe de Vienne <christophe@unlish.com>
parents: 11522
diff changeset
   109
        origin=' '.join(cwconfig['access-control-allow-origin']),
11547
fd7d2033cd80 [cors] Fix 'headers' and 'methods' parameters
Christophe de Vienne <christophe@unlish.com>
parents: 11540
diff changeset
   110
        headers=', '.join(cwconfig['access-control-allow-headers']),
fd7d2033cd80 [cors] Fix 'headers' and 'methods' parameters
Christophe de Vienne <christophe@unlish.com>
parents: 11540
diff changeset
   111
        methods=', '.join(cwconfig['access-control-allow-methods']),
11511
13e0f569684c Use 'wsgicors' for CORS handling.
Christophe de Vienne <christophe@unlish.com>
parents: 11503
diff changeset
   112
        credentials='true')
11535
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
   113
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
   114
    if profile:
11631
faf279e33298 Merge with pyramid-cubicweb
Yann Voté <yann.vote@logilab.fr>
parents: 11623
diff changeset
   115
        from cubicweb.pyramid.profile import wsgi_profile
11535
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
   116
        filename = profile_output or config.registry.settings.get(
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
   117
            'cubicweb.profile.output', 'program.prof')
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
   118
        dump_every = profile_dump_every or config.registry.settings.get(
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
   119
            'cubicweb.profile.dump_every', 100)
dd875009cc47 [profile] Add a profiling tool
Christophe de Vienne <christophe@unlish.com>
parents: 11534
diff changeset
   120
        app = wsgi_profile(app, filename=filename, dump_every=dump_every)
11511
13e0f569684c Use 'wsgicors' for CORS handling.
Christophe de Vienne <christophe@unlish.com>
parents: 11503
diff changeset
   121
    return app
11522
568204930c85 Provides a full wsgi cubicweb application builder
Christophe de Vienne <christophe@unlish.com>
parents: 11511
diff changeset
   122
568204930c85 Provides a full wsgi cubicweb application builder
Christophe de Vienne <christophe@unlish.com>
parents: 11511
diff changeset
   123
568204930c85 Provides a full wsgi cubicweb application builder
Christophe de Vienne <christophe@unlish.com>
parents: 11511
diff changeset
   124
def wsgi_application(instance_name=None, debug=None):
11537
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   125
    """ Build a WSGI application from a cubicweb instance name
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   126
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   127
    :param instance_name: Name of the cubicweb instance (optional). If not
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   128
                          provided, :envvar:`CW_INSTANCE` must exists.
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   129
    :param debug: Enable/disable the debug mode. If defined to True or False,
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   130
                  overrides :envvar:`CW_DEBUG`.
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   131
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   132
    The following environment variables are used if they exist:
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   133
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   134
    .. envvar:: CW_INSTANCE
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   135
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   136
        A CubicWeb instance name.
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   137
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   138
    .. envvar:: CW_DEBUG
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   139
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   140
        If defined, the debugmode is enabled.
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   141
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   142
    The function can be used as an entry-point for third-party wsgi containers.
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   143
    Below is a sample uswgi configuration file:
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   144
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   145
    .. code-block:: ini
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   146
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   147
        [uwsgi]
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   148
        http = 127.0.1.1:8080
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   149
        env = CW_INSTANCE=myinstance
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   150
        env = CW_DEBUG=1
11631
faf279e33298 Merge with pyramid-cubicweb
Yann Voté <yann.vote@logilab.fr>
parents: 11623
diff changeset
   151
        module = cubicweb.pyramid:wsgi_application()
11537
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   152
        virtualenv = /home/user/.virtualenvs/myvirtualenv
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   153
        processes = 1
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   154
        threads = 8
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   155
        stats = 127.0.0.1:9191
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   156
        plugins = http,python
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   157
caf268942436 Initial documentation.
Christophe de Vienne <christophe@unlish.com>
parents: 11535
diff changeset
   158
    """
11522
568204930c85 Provides a full wsgi cubicweb application builder
Christophe de Vienne <christophe@unlish.com>
parents: 11511
diff changeset
   159
    if instance_name is None:
11623
b6f6737d4823 wsgi: clearer exception when CW_INSTANCE is missing
Philippe Pepiot <philippe.pepiot@logilab.fr>
parents: 11620
diff changeset
   160
        instance_name = os.environ['CW_INSTANCE']
11522
568204930c85 Provides a full wsgi cubicweb application builder
Christophe de Vienne <christophe@unlish.com>
parents: 11511
diff changeset
   161
    if debug is None:
568204930c85 Provides a full wsgi cubicweb application builder
Christophe de Vienne <christophe@unlish.com>
parents: 11511
diff changeset
   162
        debug = 'CW_DEBUG' in os.environ
568204930c85 Provides a full wsgi cubicweb application builder
Christophe de Vienne <christophe@unlish.com>
parents: 11511
diff changeset
   163
568204930c85 Provides a full wsgi cubicweb application builder
Christophe de Vienne <christophe@unlish.com>
parents: 11511
diff changeset
   164
    cwconfig = cwcfg.config_for(instance_name, debugmode=debug)
568204930c85 Provides a full wsgi cubicweb application builder
Christophe de Vienne <christophe@unlish.com>
parents: 11511
diff changeset
   165
568204930c85 Provides a full wsgi cubicweb application builder
Christophe de Vienne <christophe@unlish.com>
parents: 11511
diff changeset
   166
    return wsgi_application_from_cwconfig(cwconfig)
11586
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   167
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   168
11968
bb0dfc7d2d0e [skeleton,pyramid] Move pyramid app definition in cubicweb.pyramid module
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11967
diff changeset
   169
def pyramid_app(global_config, **settings):
bb0dfc7d2d0e [skeleton,pyramid] Move pyramid app definition in cubicweb.pyramid module
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11967
diff changeset
   170
    """Return a Pyramid WSGI application bound to a CubicWeb repository."""
bb0dfc7d2d0e [skeleton,pyramid] Move pyramid app definition in cubicweb.pyramid module
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11967
diff changeset
   171
    config = Configurator(settings=settings)
bb0dfc7d2d0e [skeleton,pyramid] Move pyramid app definition in cubicweb.pyramid module
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11967
diff changeset
   172
    config.include('cubicweb.pyramid')
bb0dfc7d2d0e [skeleton,pyramid] Move pyramid app definition in cubicweb.pyramid module
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11967
diff changeset
   173
    return config.make_wsgi_app()
bb0dfc7d2d0e [skeleton,pyramid] Move pyramid app definition in cubicweb.pyramid module
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11967
diff changeset
   174
bb0dfc7d2d0e [skeleton,pyramid] Move pyramid app definition in cubicweb.pyramid module
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11967
diff changeset
   175
11586
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   176
def includeme(config):
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   177
    """Set-up a CubicWeb instance.
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   178
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   179
    The CubicWeb instance can be set in several ways:
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   180
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   181
    -   Provide an already loaded CubicWeb config instance in the registry:
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   182
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   183
        .. code-block:: python
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   184
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   185
            config.registry['cubicweb.config'] = your_config_instance
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   186
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   187
    -   Provide an instance name in the pyramid settings with
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   188
        :confval:`cubicweb.instance`.
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   189
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   190
    """
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   191
    cwconfig = config.registry.get('cubicweb.config')
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   192
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   193
    if cwconfig is None:
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   194
        debugmode = asbool(
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   195
            config.registry.settings.get('cubicweb.debug', False))
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   196
        cwconfig = cwcfg.config_for(
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   197
            config.registry.settings['cubicweb.instance'], debugmode=debugmode)
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   198
        config.registry['cubicweb.config'] = cwconfig
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   199
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   200
    if cwconfig.debugmode:
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   201
        try:
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   202
            config.include('pyramid_debugtoolbar')
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   203
        except ImportError:
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   204
            warn('pyramid_debugtoolbar package not available, install it to '
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   205
                 'get UI debug features', RuntimeWarning)
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   206
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   207
    config.registry['cubicweb.repository'] = repo = cwconfig.repository()
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   208
    config.registry['cubicweb.registry'] = repo.vreg
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   209
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   210
    if asbool(config.registry.settings.get('cubicweb.defaults', True)):
11631
faf279e33298 Merge with pyramid-cubicweb
Yann Voté <yann.vote@logilab.fr>
parents: 11623
diff changeset
   211
        config.include('cubicweb.pyramid.defaults')
11586
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   212
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   213
    for name in aslist(config.registry.settings.get('cubicweb.includes', [])):
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   214
        config.include(name)
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   215
11631
faf279e33298 Merge with pyramid-cubicweb
Yann Voté <yann.vote@logilab.fr>
parents: 11623
diff changeset
   216
    config.include('cubicweb.pyramid.tools')
faf279e33298 Merge with pyramid-cubicweb
Yann Voté <yann.vote@logilab.fr>
parents: 11623
diff changeset
   217
    config.include('cubicweb.pyramid.core')
11702
be23c3813bbf [pyramid] Override cubicweb.hooks.syncsession.get_user_sessions() for Pyramid
Sylvain Thénault <sylvain.thenault@logilab.fr>
parents: 11631
diff changeset
   218
    config.include('cubicweb.pyramid.syncsession')
11586
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   219
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   220
    if asbool(config.registry.settings.get('cubicweb.bwcompat', True)):
11631
faf279e33298 Merge with pyramid-cubicweb
Yann Voté <yann.vote@logilab.fr>
parents: 11623
diff changeset
   221
        config.include('cubicweb.pyramid.bwcompat')