예제 #1
0
    def handle(self, *args, **options):
        use_kernel = options['kernel']
        use_notebook = options['notebook']
        use_jupyterlab = options['lab']
        use_ipython = options['ipython']
        use_bpython = options['bpython']
        use_plain = options['plain']
        use_idle = options['idle']
        use_ptpython = options['ptpython']
        use_ptipython = options['ptipython']
        verbosity = options["verbosity"]
        print_sql = getattr(settings, 'SHELL_PLUS_PRINT_SQL', False)

        with monkey_patch_cursordebugwrapper(print_sql=options["print_sql"] or print_sql, print_sql_location=options["print_sql_location"], confprefix="SHELL_PLUS"):
            shells = (
                ('ptipython', self.get_ptipython),
                ('ptpython', self.get_ptpython),
                ('bpython', self.get_bpython),
                ('ipython', self.get_ipython),
                ('plain', self.get_plain),
                ('notebook', self.get_notebook),
                ('lab', self.get_jupyterlab),
                ('idle', self.get_idle),
            )
            SETTINGS_SHELL_PLUS = getattr(settings, 'SHELL_PLUS', None)

            shell = None
            shell_name = "any"
            self.set_application_name(options)
            if use_kernel:
                shell = self.get_kernel(options)
                shell_name = "IPython Kernel"
            elif use_notebook:
                shell = self.get_notebook(options)
                shell_name = "IPython Notebook"
            elif use_jupyterlab:
                shell = self.get_jupyterlab(options)
                shell_name = "JupyterLab Notebook"
            elif use_plain:
                shell = self.get_plain(options)
                shell_name = "plain"
            elif use_ipython:
                shell = self.get_ipython(options)
                shell_name = "IPython"
            elif use_bpython:
                shell = self.get_bpython(options)
                shell_name = "BPython"
            elif use_ptpython:
                shell = self.get_ptpython(options)
                shell_name = "ptpython"
            elif use_ptipython:
                shell = self.get_ptipython(options)
                shell_name = "ptipython"
            elif use_idle:
                shell = self.get_idle(options)
                shell_name = "idle"
            elif SETTINGS_SHELL_PLUS:
                shell_name = SETTINGS_SHELL_PLUS
                shell = dict(shells)[shell_name](options)
            else:
                for shell_name, func in shells:
                    if verbosity > 2:
                        print(self.style.NOTICE("Trying shell: %s" % shell_name))
                    shell = func(options)
                    if callable(shell):
                        if verbosity > 1:
                            print(self.style.NOTICE("Using shell: %s" % shell_name))
                        break

            if not callable(shell):
                if shell:
                    print(shell)
                print(self.style.ERROR("Could not load %s interactive Python environment." % shell_name))
                return

            if self.tests_mode:
                return 130

            if options['command']:
                imported_objects = self.get_imported_objects(options)
                exec(options['command'], {}, imported_objects)
                return None

            shell()
예제 #2
0
    def handle(self, *args, **options):
        verbosity = options["verbosity"]
        get_runner = options['runner']
        print_sql = getattr(settings, 'SHELL_PLUS_PRINT_SQL', False)
        runner = None
        runner_name = None

        with monkey_patch_cursordebugwrapper(
                print_sql=options["print_sql"] or print_sql,
                print_sql_location=options["print_sql_location"],
                confprefix="SHELL_PLUS"):
            SETTINGS_SHELL_PLUS = getattr(settings, 'SHELL_PLUS', None)

            def get_runner_by_flag(flag):
                for runner in self.runners:
                    if flag in runner.runner_flags:
                        return runner
                return None

            self.set_application_name(options)

            if not get_runner and SETTINGS_SHELL_PLUS:
                get_runner = get_runner_by_flag('--%s' % SETTINGS_SHELL_PLUS)
                if not get_runner:
                    runner = None
                    runner_name = SETTINGS_SHELL_PLUS

            if get_runner:
                runner = get_runner(options)
                runner_name = get_runner.runner_name
            else:

                def try_runner(get_runner):
                    runner_name = get_runner.runner_name
                    if verbosity > 2:
                        print(self.style.NOTICE("Trying: %s" % runner_name))

                    runner = get_runner(options)
                    if callable(runner):
                        if verbosity > 1:
                            print(self.style.NOTICE("Using: %s" % runner_name))
                        return runner
                    return None

                tried_runners = set()

                # try the runners that are least unexpected (normal shell runners)
                preferred_runners = [
                    'ptipython', 'ptpython', 'bpython', 'ipython', 'plain'
                ]
                for flag_suffix in preferred_runners:
                    get_runner = get_runner_by_flag('--%s' % flag_suffix)
                    tried_runners.add(get_runner)
                    runner = try_runner(get_runner)
                    if runner:
                        runner_name = get_runner.runner_name
                        break

                # try any remaining runners if needed
                if not runner:
                    for get_runner in self.runners:
                        if get_runner not in tried_runners:
                            runner = try_runner(get_runner)
                            if runner:
                                runner_name = get_runner.runner_name
                                break

            if not callable(runner):
                if runner:
                    print(runner)
                if not runner_name:
                    raise CommandError("No shell runner could be found.")
                raise CommandError("Could not load shell runner: '%s'." %
                                   runner_name)

            if self.tests_mode:
                return 130

            if options['command']:
                imported_objects = self.get_imported_objects(options)
                exec(options['command'], {}, imported_objects)
                return None

            runner()
예제 #3
0
    def handle(self, *args, **options):
        addrport = options['addrport']
        startup_messages = options['startup_messages']
        if startup_messages == "reload":
            self.show_startup_messages = os.environ.get(
                'RUNSERVER_PLUS_SHOW_MESSAGES')
        elif startup_messages == "once":
            self.show_startup_messages = not os.environ.get(
                'RUNSERVER_PLUS_SHOW_MESSAGES')
        elif startup_messages == "never":
            self.show_startup_messages = False
        else:
            self.show_startup_messages = True

        os.environ['RUNSERVER_PLUS_SHOW_MESSAGES'] = '1'

        setup_logger(
            logger, self.stderr,
            filename=options['output_file'])  # , fmt="[%(name)s] %(message)s")
        logredirect = RedirectHandler(__name__)

        # Redirect werkzeug log items
        werklogger = logging.getLogger('werkzeug')
        werklogger.setLevel(logging.INFO)
        werklogger.addHandler(logredirect)
        werklogger.propagate = False

        pdb_option = options['pdb']
        ipdb_option = options['ipdb']
        pm = options['pm']
        try:
            from django_pdb.middleware import PdbMiddleware
        except ImportError:
            if pdb_option or ipdb_option or pm:
                raise CommandError(
                    "django-pdb is required for --pdb, --ipdb and --pm options. Please visit https://pypi.python.org/pypi/django-pdb or install via pip. (pip install django-pdb)"
                )
            pm = False
        else:
            # Add pdb middleware if --pdb is specified or if in DEBUG mode
            if (pdb_option or ipdb_option or settings.DEBUG):
                middleware = 'django_pdb.middleware.PdbMiddleware'
                settings_middleware = getattr(
                    settings, 'MIDDLEWARE',
                    None) or settings.MIDDLEWARE_CLASSES

                if middleware not in settings_middleware:
                    if isinstance(settings_middleware, tuple):
                        settings_middleware += (middleware, )
                    else:
                        settings_middleware += [middleware]

            # If --pdb is specified then always break at the start of views.
            # Otherwise break only if a 'pdb' query parameter is set in the url
            if pdb_option:
                PdbMiddleware.always_break = 'pdb'
            elif ipdb_option:
                PdbMiddleware.always_break = 'ipdb'

            def postmortem(request, exc_type, exc_value, tb):
                if has_ipdb():
                    import ipdb
                    p = ipdb
                else:
                    import pdb
                    p = pdb
                print("Exception occured: %s, %s" % (exc_type, exc_value),
                      file=sys.stderr)
                p.post_mortem(tb)

        # usurp django's handler
        django_views_debug.technical_500_response = postmortem if pm else null_technical_500_response

        self.use_ipv6 = options['use_ipv6']
        if self.use_ipv6 and not socket.has_ipv6:
            raise CommandError('Your Python does not support IPv6.')
        self._raw_ipv6 = False
        if not addrport:
            try:
                addrport = settings.RUNSERVERPLUS_SERVER_ADDRESS_PORT
            except AttributeError:
                pass
        if not addrport:
            self.addr = ''
            self.port = DEFAULT_PORT
        else:
            m = re.match(naiveip_re, addrport)
            if m is None:
                raise CommandError('"%s" is not a valid port number '
                                   'or address:port pair.' % addrport)
            self.addr, _ipv4, _ipv6, _fqdn, self.port = m.groups()
            if not self.port.isdigit():
                raise CommandError("%r is not a valid port number." %
                                   self.port)
            if self.addr:
                if _ipv6:
                    self.addr = self.addr[1:-1]
                    self.use_ipv6 = True
                    self._raw_ipv6 = True
                elif self.use_ipv6 and not _fqdn:
                    raise CommandError('"%s" is not a valid IPv6 address.' %
                                       self.addr)
        if not self.addr:
            self.addr = '::1' if self.use_ipv6 else '127.0.0.1'
            self._raw_ipv6 = True

        with monkey_patch_cursordebugwrapper(
                print_sql=options["print_sql"],
                print_sql_location=options["print_sql_location"],
                logger=logger.info,
                confprefix="RUNSERVER_PLUS"):
            self.inner_run(options)