Beispiel #1
0
def template(template_directory=None, template_filename=None, **kwargs):
    ibs = current_app.ibs
    global_args = {
        'NAVBAR': NavbarClass(),
        'YEAR': date.today().year,
        'URL': flask.request.url,
        'REFER_SRC_STR': flask.request.url.replace(flask.request.url_root,
                                                   '/'),
        '__login__': flask.request.url_rule.rule == url_for('login'),
        '__wrapper__': True,
        '__wrapper_header__': True,
        '__wrapper_footer__': True,
        '__containerized__': ibs.containerized,
        '__https__': ibs.https,
        'user': controller_inject.get_user(),
        'GOOGLE_MAPS_API_KEY': '<<INSERT GOOGLE API KEY>>',
    }
    global_args['REFER_SRC_ENCODED'] = encode_refer_url(
        global_args['REFER_SRC_STR'])
    if 'refer' in flask.request.args.keys():
        refer = flask.request.args['refer']
        logger.info('[web] REFER: %r' % (refer, ))
        global_args['REFER_DST_ENCODED'] = refer
        global_args['REFER_DST_STR'] = decode_refer_url(refer)
    if template_directory is None:
        template_directory = ''
        # template_directory = abspath(join(dirname(__file__), 'templates'))
        # template_directory = join(dirname(dirname(__file__)))
    if template_filename is None:
        template_filename = 'index'
    template_ = join(template_directory, template_filename + '.html')
    # Update global args with the template's args
    _global_args = dict(global_args)
    _global_args.update(kwargs)
    logger.info('[appfuncs] template()')
    app = controller_inject.get_flask_app()
    # flask hates windows apparently
    template_ = template_.replace('\\', '/')
    logger.info('[appfuncs.template] * app.template_folder = %r' %
                (app.template_folder, ))
    logger.info('[appfuncs.template] * template_directory = %r' %
                (template_directory, ))
    logger.info('[appfuncs.template] * template_filename = %r' %
                (template_filename, ))
    logger.info('[appfuncs.template] * template_ = %r' % (template_, ))
    try:
        ret = flask.render_template(template_, **_global_args)
        # ret = flask.render_template(full_template_fpath, **_global_args)
    except jinja2.exceptions.TemplateNotFound as ex:
        logger.info('Error template not found')
        full_template_fpath = join(app.template_folder, template_)
        logger.info('[appfuncs.template] * full_template_fpath = %r' %
                    (full_template_fpath, ))
        ut.checkpath(full_template_fpath, verbose=True)
        ut.printex(ex, 'Template error in appfuncs', tb=True)
        raise
    except Exception as ex:
        ut.printex(ex, 'Error in appfuncs', tb=True)
        raise
    return ret
Beispiel #2
0
def opendb_with_web(*args, with_job_engine=False, **kwargs):
    """Opens the database and starts the web server.

    Returns:
        ibs, client - IBEISController and Werkzeug Client

    Example:
        >>> from wbia.entry_points import opendb_with_web
        >>> expected_response_data = {'status': {'success': True, 'code': 200, 'message': '', 'cache': -1}, 'response': True}
        >>> with opendb_with_web('testdb1') as (ibs, client):
        ...     response = client.get('/api/test/heartbeat/')
        ...     assert expected_response_data == response.json

    """
    from wbia.control.controller_inject import get_flask_app

    # Create the controller instance
    ibs = opendb(*args, **kwargs)
    if with_job_engine:
        # TODO start jobs engine
        pass

    # Create the web application
    app = get_flask_app()
    # ??? Gotta attach the controller to the application?
    setattr(app, 'ibs', ibs)

    # Return the controller and client instances to the caller
    with app.test_client() as client:
        yield ibs, client
Beispiel #3
0
def opendb_fg_web(*args, **kwargs):
    """
    Ignore:
        >>> from wbia.entry_points import *  # NOQA
        >>> kwargs = {'db': 'testdb1'}
        >>> args = tuple()

        >>> import wbia
        >>> ibs = wbia.opendb_fg_web()

    """
    # Gives you context inside the web app for testing
    kwargs['start_web_loop'] = False
    kwargs['web'] = True
    kwargs['browser'] = False
    ibs = opendb(*args, **kwargs)
    from wbia.control import controller_inject

    app = controller_inject.get_flask_app()
    ibs.app = app
    return ibs
Beispiel #4
0
    def _start_tornado(ibs_, port_):
        # Get Flask app
        app = controller_inject.get_flask_app()

        app.ibs = ibs_
        # Try to ascertain the socket's domain name
        socket.setdefaulttimeout(0.1)
        try:
            app.server_domain = socket.gethostbyname(socket.gethostname())
        except socket.gaierror:
            app.server_domain = '127.0.0.1'
        socket.setdefaulttimeout(None)
        app.server_port = port_
        # URL for the web instance
        app.server_url = 'http://%s:%s' % (app.server_domain, app.server_port)
        logger.info('[web] Tornado server starting at %s' % (app.server_url, ))
        # Launch the web browser to view the web interface and API
        if browser:
            url = app.server_url + url_suffix
            import webbrowser

            logger.info('[web] opening browser with url = %r' % (url, ))
            webbrowser.open(url)

        if PROMETHEUS:
            # Add prometheus wsgi middleware to route /metrics requests
            logger.info('LOADING PROMETHEUS')
            app_ = DispatcherMiddleware(
                app, {'/metrics': prometheus_client.make_wsgi_app()})
            # Migrate the most essential settings
            app_.server_port = app.server_port
            app_.server_url = app.server_url
            app_.ibs = app.ibs
            app = app_
        else:
            logger.info('SKIPPING PROMETHEUS')

        # Start the tornado web handler
        # WSGI = Web Server Gateway Interface
        # WSGI is Python standard described in detail in PEP 3333
        wsgi_container = TimedWSGIContainer(app)

        # # Try wrapping with newrelic performance monitoring
        # try:
        #     import newrelic
        #     wsgi_container = newrelic.agent.WSGIApplicationWrapper(wsgi_container)
        # except (ImportError, AttributeError):
        #     pass

        http_server = tornado.httpserver.HTTPServer(wsgi_container)

        try:
            http_server.listen(app.server_port)
        except socket.error:
            fallback_port = ut.find_open_port(app.server_port)
            if fallback:
                logger.info(
                    'Port %s is unavailable, using fallback_port = %r' %
                    (port, fallback_port))
                start_tornado(
                    ibs,
                    port=fallback_port,
                    browser=browser,
                    url_suffix=url_suffix,
                    start_web_loop=start_web_loop,
                    fallback=False,
                )
            else:
                raise RuntimeError(
                    (('The specified IBEIS web port %d is not available, '
                      'but %d is') % (app.server_port, fallback_port)))

        # Add more verbose logging
        try:
            utool_logfile_handler = ut.util_logging.__UTOOL_ROOT_LOGGER__
        except Exception:
            utool_logfile_handler = None

        if utool_logfile_handler is not None:
            logger_list = []
            try:
                logger_list += [
                    app.logger,
                ]
            except AttributeError:
                pass
            try:
                logger_list += [
                    app.app.logger,
                ]
            except AttributeError:
                pass
            logger_list += [
                logging.getLogger('concurrent'),
                logging.getLogger('concurrent.futures'),
                logging.getLogger('flask_cors.core'),
                logging.getLogger('flask_cors'),
                logging.getLogger('flask_cors.decorator'),
                logging.getLogger('flask_cors.extension'),
                logging.getLogger('urllib3'),
                logging.getLogger('requests'),
                logging.getLogger('tornado'),
                logging.getLogger('tornado.access'),
                logging.getLogger('tornado.application'),
                logging.getLogger('tornado.general'),
                logging.getLogger('websocket'),
            ]
            for logger_ in logger_list:
                logger_.setLevel(logging.INFO)
                logger_.addHandler(utool_logfile_handler)

        if start_web_loop:
            tornado.ioloop.IOLoop.instance().start()