diff --git a/docs/source/run.rst b/docs/source/run.rst index 1a28346a..2ff0ce1c 100644 --- a/docs/source/run.rst +++ b/docs/source/run.rst @@ -127,3 +127,60 @@ However, in this configuration, Gunicorn does not reload the application when new workers are started. See the note about preloading_. .. _preloading: configure.html#preload-app + + +custom application +------------------ + +Sometimes, you want to integrate Gunicorn with your WSGI application. In this +case, you can inherit from gunicorn.app.base.BaseApplication. + +Example:: + + #!/usr/bin/env python + import gunicorn.app.base + + def my_index(environ, start_response): + response_body = 'Works fine' + status = '200 OK' + + response_headers = [ + ('Content-Type', 'text/plain'), + ('Content-Length', str(len(response_body))) + ] + + start_response(status, response_headers) + + return [response_body] + + class MyApplication(gunicorn.app.base.BaseApplication): + def __init__(self, app, options=None): + self.options = dict(options or {}) + self.application = app + super(MyApplication, self).__init__() + + def load_config(self): + tmp_config = map( + lambda item: (item[0].lower(), item[1]), + self.options.iteritems() + ) + + config = dict( + (key, value) + for key, value in tmp_config + if key in self.cfg.settings and value is not None + ) + + for key, value in config.iteritems(): + self.cfg.set(key.lower(), value) + + def load(self): + return self.application + + if __name__ == '__main__': + options = { + 'bind': '%s:%s' % ('127.0.0.1', '8080'), + 'workers': 4, + # 'pidfile': pidfile, + } + MyApplication(my_index, options).run()