web/ldt/management/commands/testrunserver.py
changeset 22 83b28fc0d731
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/ldt/management/commands/testrunserver.py	Mon Dec 13 23:55:19 2010 +0100
@@ -0,0 +1,79 @@
+from django.core.management.commands.runserver import Command as RunserverCommand
+from django.core.servers.basehttp import WSGIServer, WSGIRequestHandler
+import sys
+import threading
+from threading import Event
+from django.conf import settings
+
+def run(addr, port, wsgi_handler, keep_running=None, ready_event=None):
+    server_address = (addr, port)
+    httpd = WSGIServer(server_address, WSGIRequestHandler)
+    httpd.set_app(wsgi_handler)
+    if keep_running is None:
+        if ready_event is not None:
+            ready_event.set()
+        httpd.serve_forever()
+    else:
+        if ready_event is not None:
+            ready_event.set()
+        while keep_running():
+            httpd.handle_request() 
+            
+
+
+class Command(RunserverCommand):
+    def handle(self, addrport='', keep_running=None, ready_event=None, *args, **options):
+        import django
+        from django.core.servers.basehttp import AdminMediaHandler, WSGIServerException
+        from django.core.handlers.wsgi import WSGIHandler
+        if args:
+            raise CommandError('Usage is testrunserver %s' % self.args)
+        if not addrport:
+            addr = ''
+            port = '8000'
+        else:
+            try:
+                addr, port = addrport.split(':')
+            except ValueError:
+                addr, port = '', addrport
+        if not addr:
+            addr = '127.0.0.1'
+
+        if not port.isdigit():
+            raise CommandError("%r is not a valid port number." % port)
+
+        admin_media_path = options.get('admin_media_path', '')
+        shutdown_message = options.get('shutdown_message', '')
+        quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C'
+
+        from django.conf import settings
+        from django.utils import translation
+        print "Validating models..."
+        self.validate(display_num_errors=True)
+        print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE)
+        print "Development server is running at http://%s:%s/" % (addr, port)
+        print "Quit the server with %s." % quit_command
+
+        translation.activate(settings.LANGUAGE_CODE)
+
+        try:
+            handler = AdminMediaHandler(WSGIHandler(), admin_media_path)
+            run(addr, int(port), handler, keep_running, ready_event)
+        except WSGIServerException, e:
+            # Use helpful error messages instead of ugly tracebacks.
+            ERRORS = {
+                13: "You don't have permission to access that port.",
+                98: "That port is already in use.",
+                99: "That IP address can't be assigned-to.",
+            }
+            try:
+                error_text = ERRORS[e.args[0].args[0]]
+            except (AttributeError, KeyError):
+                error_text = str(e)
+            sys.stderr.write(self.style.ERROR("Error: %s" % error_text) + '\n')
+            # Need to use an OS exit because sys.exit doesn't work in a thread
+        except KeyboardInterrupt:
+            if shutdown_message:
+                print shutdown_message
+
+    
\ No newline at end of file