async def get(self, path, *args, **kwargs): if path in _APPS: app, context = _APPS[path] else: if path.endswith('yml') or path.endswith('.yaml'): from lumen.config import config from lumen.command import build_single_handler_application as build_lumen config.dev = True app = build_lumen(path, argv=None) else: app = build_single_handler_application(path) context = ApplicationContext(app, url=path) context._loop = tornado.ioloop.IOLoop.current() _APPS[path] = (app, context) self.application_context = context session = await self.get_session() page = server_html_page_for_session( session, resources=RESOURCES, title=session.document.title, template=session.document.template, template_variables=session.document.template_variables ) self.set_header("Content-Type", 'text/html') self.write(page)
def __init__(self, url: str, app: ApplicationLike, *, document: bool = False, autoload: bool = False) -> None: self.url = url self.app = self._fixup(self._normalize(app)) self.app_context = ApplicationContext(self.app, url=self.url) self.document = document self.autoload = autoload
def ready(self): print("DjangoBokehConfig.ready()") os.environ['BOKEH_NODEJS_PATH'] = settings.BOKEH_NODEJS_PATH bokeh_app_base_path = os.path.join(settings.BASE_DIR, "djangobokeh", "bokeh_apps") path_list = glob.glob(os.path.join(bokeh_app_base_path, "*.py")) print(path_list) applications = {} for path in path_list: application = build_single_handler_application(path) route = application.handlers[0].url_path() if not route: if '/' in applications: raise RuntimeError( "Don't know the URL path to use for %s" % (path)) route = '/' applications[route] = application if callable(applications): applications = Application(FunctionHandler(applications)) if isinstance(applications, Application): applications = {'/': applications} for k, v in list(applications.items()): if callable(v): applications[k] = Application(FunctionHandler(v)) if all(not isinstance(handler, DocumentLifecycleHandler) for handler in applications[k]._handlers): applications[k].add(DocumentLifecycleHandler()) self._applications = dict() for k, v in applications.items(): self._applications[k] = ApplicationContext(v, url=k) self.routing_config = RoutingConfiguration(self._applications)
def customize_kwargs(self, args, server_kwargs): '''Allows subclasses to customize ``server_kwargs``. Should modify and return a copy of the ``server_kwargs`` dictionary. ''' kwargs = dict(server_kwargs) if 'index' not in kwargs: kwargs['index'] = INDEX_HTML # Handle tranquilized functions in the supplied functions kwargs['extra_patterns'] = patterns = kwargs.get('extra_patterns', []) if args.static_dirs: static_dirs = parse_vars(args.static_dirs) patterns += get_static_routes(static_dirs) files = [] for f in args.files: if args.glob: files.extend(glob(f)) else: files.append(f) if args.index and not args.index.endswith('.html') and not any(f.endswith(args.index) for f in files): raise ValueError("The --index argument must either specify a jinja2 " "template with a .html file extension or select one " "of the applications being served as the default. " f"The specified application {args.index!r} could " "not be found.") # Handle tranquilized functions in the supplied functions if args.rest_provider in REST_PROVIDERS: pattern = REST_PROVIDERS[args.rest_provider](files, args.rest_endpoint) patterns.extend(pattern) elif args.rest_provider is not None: raise ValueError("rest-provider %r not recognized." % args.rest_provider) config.autoreload = args.autoreload if config.autoreload: for f in files: watch(f) if args.warm or args.autoreload: argvs = {f: args.args for f in files} applications = build_single_handler_applications(files, argvs) if args.autoreload: with record_modules(): for app in applications.values(): doc = app.create_document() _cleanup_doc(doc) else: for app in applications.values(): doc = app.create_document() _cleanup_doc(doc) config.profiler = args.profiler if args.admin: from ..io.admin import admin_panel from ..io.server import per_app_patterns config._admin = True app = Application(FunctionHandler(admin_panel)) app_ctx = ApplicationContext(app, url='/admin') app_patterns = [] for p in per_app_patterns: route = '/admin' + p[0] context = {"application_context": app_ctx} route = (args.prefix or '') + route app_patterns.append((route, p[1], context)) from tornado.ioloop import IOLoop app_ctx._loop = IOLoop.current() websocket_path = None for r in app_patterns: if r[0].endswith("/ws"): websocket_path = r[0] if not websocket_path: raise RuntimeError("Couldn't find websocket path") for r in app_patterns: r[2]["bokeh_websocket_path"] = websocket_path try: import snakeviz SNAKEVIZ_PATH = os.path.join(os.path.dirname(snakeviz.__file__), 'static') app_patterns.append( ('/snakeviz/static/(.*)', StaticFileHandler, dict(path=SNAKEVIZ_PATH)) ) except Exception: pass patterns.extend(app_patterns) config.session_history = args.session_history if args.rest_session_info: pattern = REST_PROVIDERS['param'](files, 'rest') patterns.extend(pattern) state.publish('session_info', state, ['session_info']) if args.oauth_provider: config.oauth_provider = args.oauth_provider if config.oauth_key and args.oauth_key: raise ValueError( "Supply OAuth key either using environment variable " "or via explicit argument, not both." ) elif args.oauth_key: config.oauth_key = args.oauth_key elif not config.oauth_key: raise ValueError( "When enabling an OAuth provider you must supply " "a valid oauth_key either using the --oauth-key " "CLI argument or PANEL_OAUTH_KEY environment " "variable." ) if config.oauth_secret and args.oauth_secret: raise ValueError( "Supply OAuth secret either using environment variable " "or via explicit argument, not both." ) elif args.oauth_secret: config.oauth_secret = args.oauth_secret elif not config.oauth_secret: raise ValueError( "When enabling an OAuth provider you must supply " "a valid OAuth secret either using the --oauth-secret " "CLI argument or PANEL_OAUTH_SECRET environment " "variable." ) if args.oauth_extra_params: config.oauth_extra_params = ast.literal_eval(args.oauth_extra_params) if config.oauth_encryption_key and args.oauth_encryption_key: raise ValueError( "Supply OAuth encryption key either using environment " "variable or via explicit argument, not both." ) elif args.oauth_encryption_key: encryption_key = args.oauth_encryption_key.encode('ascii') try: key = base64.urlsafe_b64decode(encryption_key) except Exception: raise ValueError("OAuth encryption key was not a valid base64 " "string. Generate an encryption key with " "`panel oauth-secret` and ensure you did not " "truncate the returned string.") if len(key) != 32: raise ValueError( "OAuth encryption key must be 32 url-safe " "base64-encoded bytes." ) config.oauth_encryption_key = encryption_key else: print("WARNING: OAuth has not been configured with an " "encryption key and will potentially leak " "credentials in cookies and a JWT token embedded " "in the served website. Use at your own risk or " "generate a key with the `panel oauth-key` CLI " "command and then provide it to `panel serve` " "using the PANEL_OAUTH_ENCRYPTION environment " "variable or the --oauth-encryption-key CLI " "argument.") if config.oauth_encryption_key: try: from cryptography.fernet import Fernet except ImportError: raise ImportError( "Using OAuth2 provider with Panel requires the " "cryptography library. Install it with `pip install " "cryptography` or `conda install cryptography`." ) state.encryption = Fernet(config.oauth_encryption_key) if args.cookie_secret and config.cookie_secret: raise ValueError( "Supply cookie secret either using environment " "variable or via explicit argument, not both." ) elif args.cookie_secret: config.cookie_secret = args.cookie_secret else: raise ValueError( "When enabling an OAuth provider you must supply " "a valid cookie_secret either using the --cookie-secret " "CLI argument or the PANEL_COOKIE_SECRET environment " "variable." ) kwargs['auth_provider'] = OAuthProvider() if args.oauth_redirect_uri and config.oauth_redirect_uri: raise ValueError( "Supply OAuth redirect URI either using environment " "variable or via explicit argument, not both." ) elif args.oauth_redirect_uri: config.oauth_redirect_uri = args.oauth_redirect_uri if args.oauth_jwt_user and config.oauth_jwt_user: raise ValueError( "Supply OAuth JWT user either using environment " "variable or via explicit argument, not both." ) elif args.oauth_jwt_user: config.oauth_jwt_user = args.oauth_jwt_user if config.cookie_secret: kwargs['cookie_secret'] = config.cookie_secret return kwargs