Ejemplo n.º 1
0
 def ready(self):
     """Initialisation for django-ddp (setup lookups and signal handlers)."""
     if not settings.DATABASES:
         raise ImproperlyConfigured("No databases configured.")
     for (alias, conf) in settings.DATABASES.items():
         engine = conf["ENGINE"]
         if engine not in ["django.db.backends.postgresql", "django.db.backends.postgresql_psycopg2"]:
             warnings.warn("Database %r uses unsupported %r engine." % (alias, engine), UserWarning)
     self.api = autodiscover()
     self.api.ready()
Ejemplo n.º 2
0
 def ready(self):
     """Initialisation for django-ddp (setup lookups and signal handlers)."""
     if not settings.DATABASES:
         raise ImproperlyConfigured('No databases configured.')
     for (alias, conf) in settings.DATABASES.items():
         if conf['ENGINE'] != 'django.db.backends.postgresql_psycopg2':
             raise ImproperlyConfigured(
                 '%r uses %r: django-ddp only works with PostgreSQL.' % (
                     alias, conf['backend'],
                 )
             )
     self.api = autodiscover()
     self.api.ready()
Ejemplo n.º 3
0
 def ready(self):
     """Initialisation for django-ddp (setup lookups and signal handlers)."""
     if not settings.DATABASES:
         raise ImproperlyConfigured('No databases configured.')
     for (alias, conf) in settings.DATABASES.items():
         engine = conf['ENGINE']
         if engine != 'django.db.backends.postgresql_psycopg2':
             warnings.warn(
                 'Database %r uses unsupported %r engine.' % (
                     alias, engine,
                 ),
                 UserWarning,
             )
     self.api = autodiscover()
     self.api.ready()
Ejemplo n.º 4
0
 def ready(self):
     """Initialisation for django-ddp (setup lookups and signal handlers)."""
     if not settings.DATABASES:
         raise ImproperlyConfigured('No databases configured.')
     for (alias, conf) in settings.DATABASES.items():
         engine = conf['ENGINE']
         if engine != 'django.db.backends.postgresql_psycopg2':
             warnings.warn(
                 'Database %r uses unsupported %r engine.' % (
                     alias,
                     engine,
                 ),
                 UserWarning,
             )
     self.api = autodiscover()
     self.api.ready()
Ejemplo n.º 5
0
    def handle(self, *args, **options):
        """Spawn greenlets for handling websockets and PostgreSQL calls."""
        # shutdown existing connections, mokey patch stdlib for gevent.
        close_old_connections()
        gevent.monkey.patch_all()
        psycogreen.gevent.patch_psycopg()

        debug = int(options['verbosity']) > 1

        # setup PostgresGreenlet to multiplex DB calls
        postgres = PostgresGreenlet(connection, debug=debug)
        DDPWebSocketApplication.pgworker = postgres

        # use settings.WSGI_APPLICATION or fallback to default Django WSGI app
        from django.conf import settings
        if hasattr(settings, 'WSGI_APPLICATION'):
            wsgi_name = settings.WSGI_APPLICATION
            wsgi_app = import_string(wsgi_name)
        else:
            from django.core.wsgi import get_wsgi_application
            wsgi_app = get_wsgi_application()
            wsgi_name = str(wsgi_app.__class__)

        resource = geventwebsocket.Resource({
            r'/websocket': DDPWebSocketApplication,
            r'^/sockjs/\d+/\w+/websocket$': DDPWebSocketApplication,
            r'^/sockjs/\d+/\w+/xhr$': ddpp_sockjs_xhr,
            r'^/sockjs/info$': ddpp_sockjs_info,
            r'^/(?!(websocket|sockjs)/)': wsgi_app,
        })

        # setup WebSocketServer to dispatch web requests
        host = options['host']
        port = options['port']
        if port.isdigit():
            port = int(port)
        else:
            port = socket.getservbyname(port)
        webserver = geventwebsocket.WebSocketServer(
            (host, port),
            resource,
            debug=debug,
        )

        def killall(*args, **kwargs):
            """Kill all green threads."""
            postgres.stop()
            webserver.stop()

        # die gracefully with SIGINT or SIGQUIT
        gevent.signal(signal.SIGINT, killall)
        gevent.signal(signal.SIGQUIT, killall)

        print('=> Discovering DDP endpoints...')
        ddp = autodiscover()
        ddp.pgworker = postgres
        print(
            '\n'.join(
                '    %s' % api_path
                for api_path
                in sorted(ddp.api_path_map())
            ),
        )

        # start greenlets
        postgres.start()
        print('=> Started PostgresGreenlet.')
        web = gevent.spawn(webserver.serve_forever)
        print('=> Started DDPWebSocketApplication.')
        print('=> Started your app (%s).' % wsgi_name)
        print('')
        print('=> App running at: http://%s:%d/' % (host, port))
        gevent.joinall([postgres, web])
Ejemplo n.º 6
0
def serve(listen, debug=False):
    """Spawn greenlets for handling websockets and PostgreSQL calls."""
    import signal
    from django.db import connection, close_old_connections
    from django.utils.module_loading import import_string
    from dddp import autodiscover
    from dddp.postgres import PostgresGreenlet
    from dddp.websocket import DDPWebSocketApplication
    import gevent
    import geventwebsocket

    # shutdown existing connections
    close_old_connections()

    # setup PostgresGreenlet to multiplex DB calls
    postgres = PostgresGreenlet(connection, debug=debug)
    DDPWebSocketApplication.pgworker = postgres

    # use settings.WSGI_APPLICATION or fallback to default Django WSGI app
    from django.conf import settings
    if hasattr(settings, 'WSGI_APPLICATION'):
        wsgi_name = settings.WSGI_APPLICATION
        wsgi_app = import_string(wsgi_name)
    else:
        from django.core.wsgi import get_wsgi_application
        wsgi_app = get_wsgi_application()
        wsgi_name = str(wsgi_app.__class__)

    resource = geventwebsocket.Resource({
        r'/websocket': DDPWebSocketApplication,
        r'^/sockjs/\d+/\w+/websocket$': DDPWebSocketApplication,
        r'^/sockjs/\d+/\w+/xhr$': ddpp_sockjs_xhr,
        r'^/sockjs/info$': ddpp_sockjs_info,
        r'^/(?!(websocket|sockjs)/)': wsgi_app,
    })

    # setup WebSocketServer to dispatch web requests
    webservers = [
        geventwebsocket.WebSocketServer(
            (host, port),
            resource,
            debug=debug,
        )
        for host, port
        in listen
    ]

    def killall(*args, **kwargs):
        """Kill all green threads."""
        postgres.stop()
        for webserver in webservers:
            webserver.stop()

    # die gracefully with SIGINT or SIGQUIT
    gevent.signal(signal.SIGINT, killall)
    gevent.signal(signal.SIGQUIT, killall)

    print('=> Discovering DDP endpoints...')
    ddp = autodiscover()
    ddp.pgworker = postgres
    print(
        '\n'.join(
            '    %s' % api_path
            for api_path
            in sorted(ddp.api_path_map())
        ),
    )

    # start greenlets
    postgres.start()
    print('=> Started PostgresGreenlet.')
    web_threads = [
        gevent.spawn(webserver.serve_forever)
        for webserver
        in webservers
    ]
    print('=> Started DDPWebSocketApplication.')
    print('=> Started your app (%s).' % wsgi_name)
    print('')
    for host, port in listen:
        print('=> App running at: http://%s:%d/' % (host, port))
    gevent.joinall(web_threads)
    postgres.stop()
    gevent.joinall([postgres])