diff --git a/gunicorn/config.py b/gunicorn/config.py index 14a1e855..a91dfbb8 100644 --- a/gunicorn/config.py +++ b/gunicorn/config.py @@ -212,6 +212,13 @@ def validate_string(val): raise TypeError("Not a string: %s" % val) return val.strip() +def validate_class(val): + if inspect.isfunction(val) or inspect.ismethod(val): + val = val() + if inspect.isclass(val): + return val + return validate_string(val) + def validate_callable(arity): def _validate_callable(val): if not callable(val): @@ -338,7 +345,7 @@ class WorkerClass(Setting): section = "Worker Processes" cli = ["-k", "--worker-class"] meta = "STRING" - validator = validate_string + validator = validate_class default = "sync" desc = """\ The type of workers to use. @@ -740,7 +747,7 @@ class LoggerClass(Setting): section = "Logging" cli = ["--logger-class"] meta = "STRING" - validator = validate_string + validator = validate_class default = "simple" desc = """\ The logger you want to use to log events in gunicorn. diff --git a/gunicorn/util.py b/gunicorn/util.py index b2496bab..d967e5d1 100644 --- a/gunicorn/util.py +++ b/gunicorn/util.py @@ -23,6 +23,7 @@ import socket import sys import textwrap import time +import inspect MAXFD = 1024 @@ -103,6 +104,8 @@ relative import to an absolute import. return sys.modules[name] def load_class(uri, default="sync", section="gunicorn.workers"): + if inspect.isclass(uri): + return uri if uri.startswith("egg:"): # uses entry points entry_str = uri.split("egg:")[1]