Source code for crossbar.webservice.wsgi

#####################################################################################
#
#  Copyright (c) typedef int GmbH
#  SPDX-License-Identifier: EUPL-1.2
#
#####################################################################################

import importlib
import sys

from autobahn.twisted.resource import WSGIRootResource
from autobahn.wamp import ApplicationError
from twisted.python.threadpool import ThreadPool
from twisted.web.wsgi import WSGIResource

from crossbar.webservice.base import RouterWebService


[docs] class RouterWebServiceWsgi(RouterWebService): """ WSGI application Web service. """ @staticmethod
[docs] def create(transport, path, config): personality = transport.worker.personality personality.WEB_SERVICE_CHECKERS["wsgi"](personality, config) reactor = transport.worker.components_shared["reactor"] if "module" not in config: raise ApplicationError("crossbar.error.invalid_configuration", "missing WSGI app module") if "object" not in config: raise ApplicationError("crossbar.error.invalid_configuration", "missing WSGI app object") # import WSGI app module and object mod_name = config["module"] try: mod = importlib.import_module(mod_name) except ImportError as e: raise ApplicationError( "crossbar.error.invalid_configuration", 'WSGI app module "{}" import failed: {} - Python search path was {}'.format(mod_name, e, sys.path), ) obj_name = config["object"] if obj_name not in mod.__dict__: raise ApplicationError( "crossbar.error.invalid_configuration", 'WSGI app object "{}" not in module "{}"'.format(obj_name, mod_name), ) else: app = getattr(mod, obj_name) # Create a thread-pool for running the WSGI requests in pool = ThreadPool( maxthreads=config.get("maxthreads", 20), minthreads=config.get("minthreads", 0), name="crossbar_wsgi_threadpool", ) reactor.addSystemEventTrigger("before", "shutdown", pool.stop) pool.start() # Create a Twisted Web WSGI resource from the user's WSGI application object try: resource = WSGIResource(reactor, pool, app) if path == "/": resource = WSGIRootResource(resource, {}) except Exception as e: raise ApplicationError( "crossbar.error.invalid_configuration", "could not instantiate WSGI resource: {}".format(e) ) else: return RouterWebServiceWsgi(transport, path, config, resource)