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