123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- # -*- coding: utf-8 -
- #
- # This file is part of gunicorn released under the MIT license.
- # See the NOTICE for more information.
-
- import os
- import sys
-
- from gunicorn.app.base import Application
- from gunicorn import util
-
-
- def is_setting_mod(path):
- return (os.path.isfile(os.path.join(path, "settings.py")) or
- os.path.isfile(os.path.join(path, "settings.pyc")))
-
-
- def find_settings_module(path):
- path = os.path.abspath(path)
- project_path = None
- settings_name = "settings"
-
- if os.path.isdir(path):
- project_path = None
- if not is_setting_mod(path):
- for d in os.listdir(path):
- if d in ('..', '.'):
- continue
-
- root = os.path.join(path, d)
- if is_setting_mod(root):
- project_path = root
- break
- else:
- project_path = path
- elif os.path.isfile(path):
- project_path = os.path.dirname(path)
- settings_name, _ = os.path.splitext(os.path.basename(path))
-
- return project_path, settings_name
-
-
- def make_default_env(cfg):
- if cfg.django_settings:
- os.environ['DJANGO_SETTINGS_MODULE'] = cfg.django_settings
-
- if cfg.pythonpath and cfg.pythonpath is not None:
- paths = cfg.pythonpath.split(",")
- for path in paths:
- pythonpath = os.path.abspath(cfg.pythonpath)
- if pythonpath not in sys.path:
- sys.path.insert(0, pythonpath)
-
- try:
- os.environ['DJANGO_SETTINGS_MODULE']
- except KeyError:
- # not settings env set, try to build one.
- cwd = util.getcwd()
- project_path, settings_name = find_settings_module(cwd)
-
- if not project_path:
- raise RuntimeError("django project not found")
-
- pythonpath, project_name = os.path.split(project_path)
- os.environ['DJANGO_SETTINGS_MODULE'] = "%s.%s" % (project_name,
- settings_name)
- if pythonpath not in sys.path:
- sys.path.insert(0, pythonpath)
-
- if project_path not in sys.path:
- sys.path.insert(0, project_path)
-
-
- class DjangoApplication(Application):
-
- def init(self, parser, opts, args):
- if args:
- if ("." in args[0] and not (os.path.isfile(args[0])
- or os.path.isdir(args[0]))):
- self.cfg.set("django_settings", args[0])
- else:
- # not settings env set, try to build one.
- project_path, settings_name = find_settings_module(
- os.path.abspath(args[0]))
- if project_path not in sys.path:
- sys.path.insert(0, project_path)
-
- if not project_path:
- raise RuntimeError("django project not found")
-
- pythonpath, project_name = os.path.split(project_path)
- self.cfg.set("django_settings", "%s.%s" % (project_name,
- settings_name))
- self.cfg.set("pythonpath", pythonpath)
-
- def load(self):
- # chdir to the configured path before loading,
- # default is the current dir
- os.chdir(self.cfg.chdir)
-
- # set settings
- make_default_env(self.cfg)
-
- # load wsgi application and return it.
- mod = util.import_module("gunicorn.app.django_wsgi")
- return mod.make_wsgi_application()
-
-
- class DjangoApplicationCommand(Application):
-
- def __init__(self, options, admin_media_path):
- self.usage = None
- self.prog = None
- self.cfg = None
- self.config_file = options.get("config") or ""
- self.options = options
- self.admin_media_path = admin_media_path
- self.callable = None
- self.project_path = None
- self.do_load_config()
-
- def init(self, *args):
- if 'settings' in self.options:
- self.options['django_settings'] = self.options.pop('settings')
-
- cfg = {}
- for k, v in self.options.items():
- if k.lower() in self.cfg.settings and v is not None:
- cfg[k.lower()] = v
- return cfg
-
- def load(self):
- # chdir to the configured path before loading,
- # default is the current dir
- os.chdir(self.cfg.chdir)
-
- # set settings
- make_default_env(self.cfg)
-
- # load wsgi application and return it.
- mod = util.import_module("gunicorn.app.django_wsgi")
- return mod.make_command_wsgi_application(self.admin_media_path)
-
-
- def run():
- """\
- The ``gunicorn_django`` command line runner for launching Django
- applications.
- """
- util.warn("""This command is deprecated.
-
- You should now run your application with the WSGI interface
- installed with your project. Ex.:
-
- gunicorn myproject.wsgi:application
-
- See https://docs.djangoproject.com/en/1.8/howto/deployment/wsgi/gunicorn/
- for more info.""")
- from gunicorn.app.djangoapp import DjangoApplication
- DjangoApplication("%(prog)s [OPTIONS] [SETTINGS_PATH]").run()
|