diff --git a/bin/gunicorn b/bin/gunicorn index b658ebe3..a5606e18 100755 --- a/bin/gunicorn +++ b/bin/gunicorn @@ -32,6 +32,7 @@ import sys sys.path.insert(0, os.getcwd()) import gunicorn +from gunicorn import util __usage__ = "%prog [OPTIONS] APP_MODULE" @@ -51,8 +52,10 @@ def main(): if len(args) != 1: parser.error("No application module specified.") + + app = util.import_app(args[0]) - arbiter = gunicorn.Arbiter((opts.host, opts.port), opts.workers, args[0]) + arbiter = gunicorn.Arbiter((opts.host, opts.port), opts.workers, app) arbiter.run() if __name__ == '__main__': diff --git a/bin/gunicorn_django b/bin/gunicorn_django new file mode 100644 index 00000000..dcd98e53 --- /dev/null +++ b/bin/gunicorn_django @@ -0,0 +1,65 @@ +#! /usr/bin/env python +# -*- coding: utf-8 - +# +# 2009 (c) Benoit Chesneau +# 2009 (c) Paul J. Davis +# +# Permission is hereby granted, free of charge, to any person +# obtaining a copy of this software and associated documentation +# files (the "Software"), to deal in the Software without +# restriction, including without limitation the rights to use, +# copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +# OTHER DEALINGS IN THE SOFTWARE. + +import optparse as op +import os +import sys + +import django.core.handlers.wsgi +import gunicorn + +__usage__ = "%prog [OPTIONS] APP_MODULE" + +PROJECT_PATH = os.getcwd() +PROJECT_NAME = os.path.split(PROJECT_PATH)[-1] + +# set environ +sys.path.insert(0, os.path.join(PROJECT_PATH, "..")) +os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % PROJECT_NAME + +# django wsgi app +app = django.core.handlers.wsgi.WSGIHandler() + +def options(): + return [ + op.make_option('--host', dest='host', default='127.0.0.1', + help='Host to listen on. [%default]'), + op.make_option('--port', dest='port', default=8000, type='int', + help='Port to listen on. [%default]'), + op.make_option('--workers', dest='workers', default=1, type='int', + help='Number of workers to spawn. [%default]') + ] + +def main(): + parser = op.OptionParser(usage=__usage__, option_list=options()) + opts, args = parser.parse_args() + + arbiter = gunicorn.Arbiter((opts.host, opts.port), opts.workers,app) + arbiter.run() + +if __name__ == '__main__': + main() diff --git a/gunicorn/worker.py b/gunicorn/worker.py index 971623e0..39299caf 100644 --- a/gunicorn/worker.py +++ b/gunicorn/worker.py @@ -45,14 +45,14 @@ class Worker(object): "QUIT INT TERM TTIN TTOU".split() ) - def __init__(self, workerid, ppid, socket, module): + def __init__(self, workerid, ppid, socket, app): self.id = workerid self.ppid = ppid self.socket = socket self.address = socket.getsockname() self.tmp = os.tmpfile() - self.app = util.import_app(module) + self.app = app self.alive = self.tmp.fileno() def init_signals(self): diff --git a/setup.py b/setup.py index 159de801..201cb3ee 100644 --- a/setup.py +++ b/setup.py @@ -60,7 +60,7 @@ setup( packages = find_packages(), include_package_data = True, - scripts = ['bin/gunicorn'], + scripts = ['bin/gunicorn', 'bin/gunicorn_django'], )