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