def run_rest_server(manager, debug, num_processes, num_threads): """Runs the REST server.""" logging.basicConfig(format='%(asctime)s %(message)s', level=logging.INFO) host = manager.config['server']['rest_host'] port = manager.config['server']['rest_port'] install(SaveEnvironmentPlugin(manager)) install(CheckJsonPlugin()) install(oauth2_provider.check_oauth()) install(CookieAuthenticationPlugin()) install(UserVerifiedPlugin()) install(PublicUserPlugin()) install(ErrorAdapter()) # Replace default JSON plugin with one that handles datetime objects # Note: ErrorAdapter must come before JSONPlugin to catch serialization errors uninstall(JSONPlugin()) install(JSONPlugin(json_dumps=DatetimeEncoder().encode)) # JsonApiPlugin must come after JSONPlugin, to inspect and modify response # dicts before they are serialized into JSON install(JsonApiPlugin()) for code in range(100, 600): default_app().error(code)(error_handler) root_app = Bottle() root_app.mount('/rest', default_app()) # Look for templates in codalab-worksheets/views bottle.TEMPLATE_PATH = [ os.path.join( os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), 'views') ] # Increase the request body size limit to 8 MiB bottle.BaseRequest.MEMFILE_MAX = 8 * 1024 * 1024 # We use gunicorn to create a server with multiple processes, since in # Python a single process uses at most 1 CPU due to the Global Interpreter # Lock. sys.argv = sys.argv[:1] # Small hack to work around a Gunicorn arg parsing # bug. None of the arguments to cl should go to # Gunicorn. run( app=root_app, host=host, port=port, debug=debug, server='gunicorn', workers=num_processes, worker_class='gthread', threads=num_threads, worker_tmp_dir='/tmp', # don't use globally set tempdir timeout=5 * 60, )
def run_rest_server(manager, debug, num_processes, num_threads): """Runs the REST server.""" host = manager.config['server']['rest_host'] port = manager.config['server']['rest_port'] install(SaveEnvironmentPlugin(manager)) install(CheckJsonPlugin()) install(LoggingPlugin()) install(oauth2_provider.check_oauth()) install(CookieAuthenticationPlugin()) install(UserVerifiedPlugin()) install(PublicUserPlugin()) install(ErrorAdapter()) install(JsonApiPlugin()) for code in xrange(100, 600): default_app().error(code)(error_handler) root_app = Bottle() root_app.mount('/rest', default_app()) # TODO: Remove when we are confident everyone has upgraded @root_app.route('/bundleservice', method=['GET', 'POST', 'PUT', 'DELETE', 'PATCH']) def bundleservice(): abort( BAD_REQUEST, "Your CLI is attempting to connect to an old API, " "please upgrade it by running `git pull` from where " "you installed it.") bottle.TEMPLATE_PATH = [ os.path.join( os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), 'views') ] # We use gunicorn to create a server with multiple processes, since in # Python a single process uses at most 1 CPU due to the Global Interpreter # Lock. sys.argv = sys.argv[:1] # Small hack to work around a Gunicorn arg parsing # bug. None of the arguments to cl should go to # Gunicorn. run(app=root_app, host=host, port=port, debug=debug, server='gunicorn', workers=num_processes, worker_class='gthread', threads=num_threads, timeout=5 * 60)
def create_rest_app(manager=CodaLabManager()): """Creates and returns a rest app.""" install(SaveEnvironmentPlugin(manager)) install(CheckJsonPlugin()) install(oauth2_provider.check_oauth()) install(CookieAuthenticationPlugin()) install(UserVerifiedPlugin()) install(PublicUserPlugin()) install(ErrorAdapter()) # Replace default JSON plugin with one that handles datetime objects # Note: ErrorAdapter must come before JSONPlugin to catch serialization errors uninstall(JSONPlugin()) install(JSONPlugin(json_dumps=DatetimeEncoder().encode)) # JsonApiPlugin must come after JSONPlugin, to inspect and modify response # dicts before they are serialized into JSON install(JsonApiPlugin()) for code in range(100, 600): default_app().error(code)(error_handler) root_app = Bottle() root_app.mount('/rest', default_app()) # Look for templates in codalab-worksheets/views bottle.TEMPLATE_PATH = [ os.path.join( os.path.dirname( os.path.dirname(os.path.dirname(os.path.abspath(__file__)))), 'views') ] # Increase the request body size limit to 8 MiB bottle.BaseRequest.MEMFILE_MAX = 8 * 1024 * 1024 return root_app