def create_app(self): from devpi_server.view_auth import DevpiAuthenticationPolicy from devpi_server.views import ContentTypePredicate from devpi_server.views import OutsideURLMiddleware from devpi_server.views import route_url, INSTALLER_USER_AGENT from pkg_resources import get_distribution from pyramid.authorization import ACLAuthorizationPolicy from pyramid.config import Configurator from pyramid.viewderivers import INGRESS log = self.log log.debug("creating application in process %s", os.getpid()) pyramid_config = Configurator(root_factory='devpi_server.view_auth.RootFactory') pyramid_config.set_authentication_policy(DevpiAuthenticationPolicy(self)) pyramid_config.set_authorization_policy(ACLAuthorizationPolicy()) version_info = [ ("devpi-server", get_distribution("devpi_server").version)] for plug, distinfo in self.config.pluginmanager.list_plugin_distinfo(): threadlog.info("Found plugin %s-%s (%s)." % ( distinfo.project_name, distinfo.version, distinfo.location)) key = (distinfo.project_name, distinfo.version) if key not in version_info: version_info.append(key) version_info.sort() pyramid_config.registry['devpi_version_info'] = version_info pyramid_config.registry['xom'] = self index_classes = {} customizer_classes = sum( self.config.hook.devpiserver_get_stage_customizer_classes(), []) for ixtype, ixclass in customizer_classes: index_classes.setdefault(ixtype, []).append(ixclass) for ixtype, ixclasses in index_classes.items(): if len(ixclasses) > 1: fatal( "multiple implementation classes for index type '%s':\n%s" % ( ixtype, "\n".join( "%s.%s" % (x.__module__, x.__name__) for x in ixclasses))) self.config.hook.devpiserver_pyramid_configure( config=self.config, pyramid_config=pyramid_config) pyramid_config.add_view_deriver(self.view_deriver, under=INGRESS) pyramid_config.add_view_predicate('content_type', ContentTypePredicate) pyramid_config.add_route("/+changelog/{serial}", r"/+changelog/{serial:\d+}") pyramid_config.add_route("/+changelog/{serial}-", r"/+changelog/{serial:\d+}-") pyramid_config.add_route("/+status", "/+status") pyramid_config.add_route("/+api", "/+api", accept="application/json") pyramid_config.add_route("{path:.*}/+api", "{path:.*}/+api", accept="application/json") pyramid_config.add_route("/+login", "/+login", accept="application/json") pyramid_config.add_route("/{user}/{index}/+e/{relpath:.*}", "/{user}/{index}/+e/{relpath:.*}") pyramid_config.add_route("/{user}/{index}/+f/{relpath:.*}", "/{user}/{index}/+f/{relpath:.*}") pyramid_config.add_route("/{user}/{index}/+simple", "/{user}/{index}/+simple") pyramid_config.add_route("/{user}/{index}/+simple/", "/{user}/{index}/+simple/") pyramid_config.add_route("/{user}/{index}/+simple/{project}", "/{user}/{index}/+simple/{project}") pyramid_config.add_route("/{user}/{index}/+simple/{project}/", "/{user}/{index}/+simple/{project}/") pyramid_config.add_route("/{user}/{index}/+simple/{project}/refresh", "/{user}/{index}/+simple/{project}/refresh") pyramid_config.add_route("/{user}/{index}/{project}/{version}", "/{user}/{index}/{project}/{version:[^/]+/?}") pyramid_config.add_route( "simple_redirect", "/{user}/{index}/{project:[^/]+/?}", header="User-Agent:" + INSTALLER_USER_AGENT, accept="text/html", ) pyramid_config.add_route("/{user}/{index}/{project}", "/{user}/{index}/{project:[^/]+/?}") pyramid_config.add_route("/{user}/{index}/", "/{user}/{index}/") pyramid_config.add_route("/{user}/{index}", "/{user}/{index}") pyramid_config.add_route("/{user}", "/{user}") pyramid_config.add_route("/", "/") # register tweens for logging, transaction and replication pyramid_config.add_tween("devpi_server.views.tween_request_logging") pyramid_config.add_tween( "devpi_server.views.tween_keyfs_transaction", under="devpi_server.views.tween_request_logging") if self.config.args.profile_requests: pyramid_config.add_tween("devpi_server.main.tween_request_profiling") pyramid_config.add_request_method(get_remote_ip) pyramid_config.add_request_method(stage_url) pyramid_config.add_request_method(simpleindex_url) pyramid_config.add_request_method(apifatal) # overwrite route_url method with our own pyramid_config.add_request_method(route_url) # XXX end hack pyramid_config.scan() app = pyramid_config.make_wsgi_app() if self.is_replica(): from devpi_server.replica import ReplicaThread, register_key_subscribers search_path = self.config.args.replica_file_search_path if search_path and not os.path.exists(search_path): fatal( "search path for existing replica files doesn't " "exist: %s" % search_path) register_key_subscribers(self) self.replica_thread = ReplicaThread(self) # the replica thread replays keyfs changes # and project-specific changes are discovered # and replayed through the PypiProjectChange event if not self.config.requests_only: self.thread_pool.register(self.replica_thread) return OutsideURLMiddleware(app, self)
def create_app(self): from devpi_server.view_auth import DevpiAuthenticationPolicy from devpi_server.views import ContentTypePredicate from devpi_server.views import OutsideURLMiddleware from devpi_server.views import route_url, INSTALLER_USER_AGENT from pkg_resources import get_distribution from pyramid.authorization import ACLAuthorizationPolicy from pyramid.config import Configurator log = self.log log.debug("creating application in process %s", os.getpid()) pyramid_config = Configurator( root_factory='devpi_server.view_auth.RootFactory') pyramid_config.set_authentication_policy( DevpiAuthenticationPolicy(self)) pyramid_config.set_authorization_policy(ACLAuthorizationPolicy()) version_info = [("devpi-server", get_distribution("devpi_server").version)] for plug, distinfo in self.config.pluginmanager.list_plugin_distinfo(): threadlog.info( "Found plugin %s-%s (%s)." % (distinfo.project_name, distinfo.version, distinfo.location)) key = (distinfo.project_name, distinfo.version) if key not in version_info: version_info.append(key) version_info.sort() pyramid_config.registry['devpi_version_info'] = version_info self.config.hook.devpiserver_pyramid_configure( config=self.config, pyramid_config=pyramid_config) pyramid_config.add_view_predicate('content_type', ContentTypePredicate) pyramid_config.add_route("/+changelog/{serial}", "/+changelog/{serial}") pyramid_config.add_route("/+status", "/+status") pyramid_config.add_route("/+api", "/+api", accept="application/json") pyramid_config.add_route("{path:.*}/+api", "{path:.*}/+api", accept="application/json") pyramid_config.add_route("/+login", "/+login", accept="application/json") pyramid_config.add_route("/{user}/{index}/+e/{relpath:.*}", "/{user}/{index}/+e/{relpath:.*}") pyramid_config.add_route("/{user}/{index}/+f/{relpath:.*}", "/{user}/{index}/+f/{relpath:.*}") pyramid_config.add_route("/{user}/{index}/+simple", "/{user}/{index}/+simple") pyramid_config.add_route("/{user}/{index}/+simple/", "/{user}/{index}/+simple/") pyramid_config.add_route("/{user}/{index}/+simple/{project}", "/{user}/{index}/+simple/{project}") pyramid_config.add_route("/{user}/{index}/+simple/{project}/", "/{user}/{index}/+simple/{project}/") pyramid_config.add_route("/{user}/{index}/+simple/{project}/refresh", "/{user}/{index}/+simple/{project}/refresh") pyramid_config.add_route( "/{user}/{index}/{project}/{version}", "/{user}/{index}/{project}/{version:[^/]+/?}") pyramid_config.add_route( "simple_redirect", "/{user}/{index}/{project:[^/]+/?}", header="User-Agent:" + INSTALLER_USER_AGENT, accept="text/html", ) pyramid_config.add_route("/{user}/{index}/{project}", "/{user}/{index}/{project:[^/]+/?}") pyramid_config.add_route("/{user}/{index}/", "/{user}/{index}/") pyramid_config.add_route("/{user}/{index}", "/{user}/{index}") pyramid_config.add_route("/{user}", "/{user}") pyramid_config.add_route("/", "/") # register tweens for logging, transaction and replication pyramid_config.add_tween("devpi_server.views.tween_request_logging") if self.is_replica(): pyramid_config.add_tween( "devpi_server.replica.tween_replica_proxy", over="devpi_server.views.tween_keyfs_transaction", under="devpi_server.views.tween_request_logging", ) pyramid_config.add_tween( "devpi_server.views.tween_keyfs_transaction", under="devpi_server.views.tween_request_logging") if self.config.args.profile_requests: pyramid_config.add_tween( "devpi_server.main.tween_request_profiling") pyramid_config.add_request_method(get_remote_ip) pyramid_config.add_request_method(stage_url) pyramid_config.add_request_method(simpleindex_url) # overwrite route_url method with our own pyramid_config.add_request_method(route_url) # XXX end hack pyramid_config.scan() pyramid_config.registry['xom'] = self app = pyramid_config.make_wsgi_app() if self.is_replica(): from devpi_server.replica import ReplicaThread, register_key_subscribers register_key_subscribers(self) self.replica_thread = ReplicaThread(self) # the replica thread replays keyfs changes # and project-specific changes are discovered # and replayed through the PypiProjectChange event if not self.config.args.requests_only: self.thread_pool.register(self.replica_thread) return OutsideURLMiddleware(app, self)