cubicweb/pyramid/__init__.py
author Denis Laxalde <denis.laxalde@logilab.fr>
Tue, 21 Feb 2017 17:42:46 +0100
changeset 11969 2fb941d12d74
parent 11968 bb0dfc7d2d0e
child 11970 b282ef22b5ab
permissions -rw-r--r--
[pyramid] Move loading of pyramid_debugtoolbar later in includeme() To gather cwconfig and repository instantiations.
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
    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
   201
    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
   202
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   203
    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
   204
        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
   205
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   206
    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
   207
        config.include(name)
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   208
11631
faf279e33298 Merge with pyramid-cubicweb
Yann Voté <yann.vote@logilab.fr>
parents: 11623
diff changeset
   209
    config.include('cubicweb.pyramid.tools')
faf279e33298 Merge with pyramid-cubicweb
Yann Voté <yann.vote@logilab.fr>
parents: 11623
diff changeset
   210
    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
   211
    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
   212
c7a25122af4d [config] Move most config code to a includeme()
Christophe de Vienne <christophe@unlish.com>
parents: 11567
diff changeset
   213
    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
   214
        config.include('cubicweb.pyramid.bwcompat')
11969
2fb941d12d74 [pyramid] Move loading of pyramid_debugtoolbar later in includeme()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11968
diff changeset
   215
2fb941d12d74 [pyramid] Move loading of pyramid_debugtoolbar later in includeme()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11968
diff changeset
   216
    if cwconfig.debugmode:
2fb941d12d74 [pyramid] Move loading of pyramid_debugtoolbar later in includeme()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11968
diff changeset
   217
        try:
2fb941d12d74 [pyramid] Move loading of pyramid_debugtoolbar later in includeme()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11968
diff changeset
   218
            config.include('pyramid_debugtoolbar')
2fb941d12d74 [pyramid] Move loading of pyramid_debugtoolbar later in includeme()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11968
diff changeset
   219
        except ImportError:
2fb941d12d74 [pyramid] Move loading of pyramid_debugtoolbar later in includeme()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11968
diff changeset
   220
            warn('pyramid_debugtoolbar package not available, install it to '
2fb941d12d74 [pyramid] Move loading of pyramid_debugtoolbar later in includeme()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 11968
diff changeset
   221
                 'get UI debug features', RuntimeWarning)