mirror of
https://github.com/frappe/gunicorn.git
synced 2026-01-14 11:09:11 +08:00
add the --paste option and deprecate gunicorn_paster
Instead of having multiple command line just use the gunicorn one. gunicorn_django is deprecated as well.
This commit is contained in:
parent
f886d86b46
commit
b6af364c79
@ -20,36 +20,49 @@ from gunicorn.config import Config, get_default_config_file
|
||||
from gunicorn import util
|
||||
|
||||
|
||||
def paste_config(gconfig, config_url, relative_to, global_conf=None):
|
||||
# add entry to pkg_resources
|
||||
sys.path.insert(0, relative_to)
|
||||
pkg_resources.working_set.add_entry(relative_to)
|
||||
|
||||
cx = loadwsgi.loadcontext(SERVER, config_url, relative_to=relative_to,
|
||||
global_conf=global_conf)
|
||||
gc, lc = cx.global_conf.copy(), cx.local_conf.copy()
|
||||
cfg = {}
|
||||
|
||||
host, port = lc.pop('host', ''), lc.pop('port', '')
|
||||
if host and port:
|
||||
cfg['bind'] = '%s:%s' % (host, port)
|
||||
elif host:
|
||||
cfg['bind'] = host.split(',')
|
||||
|
||||
cfg['workers'] = int(lc.get('workers', 1))
|
||||
cfg['umask'] = int(lc.get('umask', 0))
|
||||
cfg['default_proc_name'] = gc.get('__file__')
|
||||
|
||||
for k, v in gc.items():
|
||||
if k not in gconfig.settings:
|
||||
continue
|
||||
cfg[k] = v
|
||||
|
||||
for k, v in lc.items():
|
||||
if k not in gconfig.settings:
|
||||
continue
|
||||
cfg[k] = v
|
||||
|
||||
return cfg
|
||||
|
||||
|
||||
def load_pasteapp(config_url, relative_to, global_conf=None):
|
||||
return loadapp(config_url, relative_to=relative_to,
|
||||
global_conf=global_conf)
|
||||
|
||||
class PasterBaseApplication(Application):
|
||||
gcfg = None
|
||||
|
||||
def app_config(self):
|
||||
cx = loadwsgi.loadcontext(SERVER, self.cfgurl,
|
||||
relative_to=self.relpath, global_conf=self.gcfg)
|
||||
gc, lc = cx.global_conf.copy(), cx.local_conf.copy()
|
||||
cfg = {}
|
||||
|
||||
host, port = lc.pop('host', ''), lc.pop('port', '')
|
||||
if host and port:
|
||||
cfg['bind'] = '%s:%s' % (host, port)
|
||||
elif host:
|
||||
cfg['bind'] = host.split(',')
|
||||
|
||||
cfg['workers'] = int(lc.get('workers', 1))
|
||||
cfg['umask'] = int(lc.get('umask', 0))
|
||||
cfg['default_proc_name'] = gc.get('__file__')
|
||||
|
||||
for k, v in gc.items():
|
||||
if k not in self.cfg.settings:
|
||||
continue
|
||||
cfg[k] = v
|
||||
|
||||
for k, v in lc.items():
|
||||
if k not in self.cfg.settings:
|
||||
continue
|
||||
cfg[k] = v
|
||||
|
||||
return cfg
|
||||
return paste_config(self.cfg, self.cfgurl, self.relpath,
|
||||
global_conf=self.gcfg)
|
||||
|
||||
def load_config(self):
|
||||
super(PasterBaseApplication, self).load_config()
|
||||
@ -91,7 +104,7 @@ class PasterApplication(PasterBaseApplication):
|
||||
# default is the current dir
|
||||
os.chdir(self.cfg.chdir)
|
||||
|
||||
return loadapp(self.cfgurl, relative_to=self.relpath, global_conf=self.gcfg)
|
||||
return load_pasteapp(self.cfgurl, self.relpath, global_conf=self.gcfg)
|
||||
|
||||
|
||||
class PasterServerApplication(PasterBaseApplication):
|
||||
@ -151,6 +164,13 @@ def run():
|
||||
The ``gunicorn_paster`` command for launcing Paster compatible
|
||||
apllications like Pylons or Turbogears2
|
||||
"""
|
||||
util.warn("""This command is deprecated.
|
||||
|
||||
You should now use the `--paste` option. Ex.:
|
||||
|
||||
gunicorn --paste development.ini
|
||||
""")
|
||||
|
||||
from gunicorn.app.pasterapp import PasterApplication
|
||||
PasterApplication("%(prog)s [OPTIONS] pasteconfig.ini").run()
|
||||
|
||||
|
||||
@ -6,21 +6,35 @@
|
||||
import os
|
||||
import sys
|
||||
|
||||
from gunicorn import util
|
||||
from gunicorn.errors import ConfigError
|
||||
from gunicorn.app.base import Application
|
||||
from gunicorn.app import djangoapp
|
||||
from gunicorn import util
|
||||
|
||||
|
||||
class WSGIApplication(Application):
|
||||
|
||||
def init(self, parser, opts, args):
|
||||
if opts.paste and opts.paste is not None:
|
||||
path = os.path.abspath(os.path.normpath(
|
||||
os.path.join(util.getcwd(), opts.paste)))
|
||||
|
||||
if not os.path.exists(path):
|
||||
raise ConfigError("%r not found" % val)
|
||||
|
||||
# paste application, load the config
|
||||
self.cfgurl = 'config:%s' % path
|
||||
self.relpath = os.path.dirname(path)
|
||||
|
||||
from .pasterapp import paste_config
|
||||
return paste_config(self.cfg, self.cfgurl, self.relpath)
|
||||
|
||||
if len(args) != 1:
|
||||
parser.error("No application module specified.")
|
||||
|
||||
self.cfg.set("default_proc_name", args[0])
|
||||
self.app_uri = args[0]
|
||||
|
||||
def load(self):
|
||||
def chdir(self):
|
||||
# chdir to the configured path before loading,
|
||||
# default is the current dir
|
||||
os.chdir(self.cfg.chdir)
|
||||
@ -28,17 +42,33 @@ class WSGIApplication(Application):
|
||||
# add the path to sys.path
|
||||
sys.path.insert(0, self.cfg.chdir)
|
||||
|
||||
def load_wsgiapp(self):
|
||||
self.chdir()
|
||||
|
||||
# load the app
|
||||
return util.import_app(self.app_uri)
|
||||
|
||||
def load_pasteapp(self):
|
||||
self.chdir()
|
||||
|
||||
# load the paste app
|
||||
from .pasterapp import load_pasteapp
|
||||
return load_pasteapp(self.cfgurl, self.relpath, global_conf=None)
|
||||
|
||||
def load(self):
|
||||
if self.cfg.paste is not None:
|
||||
return self.load_pasteapp()
|
||||
else:
|
||||
return self.load_wsgiapp
|
||||
|
||||
|
||||
def run():
|
||||
"""\
|
||||
The ``gunicorn`` command line runner for launching Gunicorn with
|
||||
The ``gunicorn`` command line runner for launching Ghunicorn with
|
||||
generic WSGI applications.
|
||||
"""
|
||||
from gunicorn.app.wsgiapp import WSGIApplication
|
||||
WSGIApplication("%(prog)s [OPTIONS] APP_MODULE").run()
|
||||
WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
|
||||
@ -401,6 +401,24 @@ def validate_chdir(val):
|
||||
|
||||
return path
|
||||
|
||||
|
||||
def validate_file(val):
|
||||
if val is None:
|
||||
return None
|
||||
|
||||
# valid if the value is a string
|
||||
val = validate_string(val)
|
||||
|
||||
# transform relative paths
|
||||
path = os.path.abspath(os.path.normpath(os.path.join(util.getcwd(), val)))
|
||||
|
||||
# test if the path exists
|
||||
if not os.path.exists(path):
|
||||
raise ConfigError("%r not found" % val)
|
||||
|
||||
return path
|
||||
|
||||
|
||||
def get_default_config_file():
|
||||
config_path = os.path.join(os.path.abspath(os.getcwd()),
|
||||
'gunicorn.conf.py')
|
||||
@ -1128,10 +1146,12 @@ class DjangoSettings(Setting):
|
||||
validator = validate_string
|
||||
default = None
|
||||
desc = """\
|
||||
The Python path to a Django settings module.
|
||||
The Python path to a Django settings module. (deprecated)
|
||||
|
||||
e.g. 'myproject.settings.main'. If this isn't provided, the
|
||||
DJANGO_SETTINGS_MODULE environment variable will be used.
|
||||
|
||||
**DEPRECATED**: use the --env argument instead.
|
||||
"""
|
||||
|
||||
|
||||
@ -1143,13 +1163,25 @@ class PythonPath(Setting):
|
||||
validator = validate_string
|
||||
default = None
|
||||
desc = """\
|
||||
A directory to add to the Python path for Django.
|
||||
A directory to add to the Python path.
|
||||
|
||||
e.g.
|
||||
'/home/djangoprojects/myproject'.
|
||||
"""
|
||||
|
||||
|
||||
class Paste(Setting):
|
||||
name = "paste"
|
||||
section = "Server Mechanics"
|
||||
cli = ["--paster"]
|
||||
meta = "STRING"
|
||||
validator = validate_string
|
||||
default = None
|
||||
desc = """\
|
||||
Load a paste.deploy config file.
|
||||
"""
|
||||
|
||||
|
||||
class OnStarting(Setting):
|
||||
name = "on_starting"
|
||||
section = "Server Hooks"
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user