# -*- 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()