def rate_limited_resource(resource_class): # default rate limit values rate_limits = { "get": "1000/10second 2000/minute 6000/5minute 10000/15minute", "post": "100/10second 1000/minute 3000/5minute 6000/15minute", "put": "100/10second 1000/minute 3000/5minute 6000/15minute", "delete": "100/10second 1000/minute 3000/5minute 6000/15minute", } limit_decorators = [] http_methods_in_resource = [ func.lower() for func in resource_class.methods ] for method in http_methods_in_resource: field = resource_class.__qualname__.split( "Resource")[0].lower() + "_" + method limits = app_config.get_key("mwdb_limiter", field) if not limits: limits = rate_limits[method] for limit in limits.split(): limit_decorators.append( limiter.limit( limit, methods=[method], error_message= (f"Request limit: {limit} for {method} method was exceeded!" ), exempt_when=is_rate_limit_disabled, )) resource_class.decorators = limit_decorators return resource_class
click.echo( textwrap.dedent( """ MWDB configured successfully! Use 'mwdb-core run' to run the server. """ ) ) @configure.command("web", with_appcontext=False) @click.option( "--target-dir", type=click.Path(resolve_path=True), default=app_config.get_key("mwdb", "web_folder"), show_default=True, help="Build target directory to be overwritten.", required=True, ) @click.pass_context def configure_web(ctx, target_dir): """ Rebuild MWDB web application files. By default MWDB serves pre-built web application bundle, but if you want to use web plugins: web need to be rebuilt from sources. Command requires Node.js and npm to be installed. """ from mwdb.cli.web import npm_build_web