web/ldt/management/commands/testrunserver.py
author wakimd
Wed, 22 Dec 2010 12:01:05 +0100
changeset 25 c8dfd7ea87e5
parent 22 83b28fc0d731
permissions -rw-r--r--
Corrections on merge
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
22
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
from django.core.management.commands.runserver import Command as RunserverCommand
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
from django.core.servers.basehttp import WSGIServer, WSGIRequestHandler
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
import sys
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
import threading
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
from threading import Event
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
from django.conf import settings
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
def run(addr, port, wsgi_handler, keep_running=None, ready_event=None):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
    server_address = (addr, port)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
    httpd = WSGIServer(server_address, WSGIRequestHandler)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
    httpd.set_app(wsgi_handler)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
    if keep_running is None:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
        if ready_event is not None:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
            ready_event.set()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
        httpd.serve_forever()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
    else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
        if ready_event is not None:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
            ready_event.set()
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
        while keep_running():
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
            httpd.handle_request() 
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
            
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
class Command(RunserverCommand):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    def handle(self, addrport='', keep_running=None, ready_event=None, *args, **options):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
        import django
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
        from django.core.servers.basehttp import AdminMediaHandler, WSGIServerException
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
        from django.core.handlers.wsgi import WSGIHandler
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
        if args:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
            raise CommandError('Usage is testrunserver %s' % self.args)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
        if not addrport:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
            addr = ''
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
            port = '8000'
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
        else:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
            try:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
                addr, port = addrport.split(':')
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
            except ValueError:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
                addr, port = '', addrport
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
        if not addr:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
            addr = '127.0.0.1'
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
        if not port.isdigit():
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
            raise CommandError("%r is not a valid port number." % port)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
        admin_media_path = options.get('admin_media_path', '')
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
        shutdown_message = options.get('shutdown_message', '')
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
        quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C'
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
        from django.conf import settings
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
        from django.utils import translation
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
        print "Validating models..."
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        self.validate(display_num_errors=True)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
        print "Development server is running at http://%s:%s/" % (addr, port)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        print "Quit the server with %s." % quit_command
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
        translation.activate(settings.LANGUAGE_CODE)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        try:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
            handler = AdminMediaHandler(WSGIHandler(), admin_media_path)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            run(addr, int(port), handler, keep_running, ready_event)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
        except WSGIServerException, e:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
            # Use helpful error messages instead of ugly tracebacks.
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
            ERRORS = {
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
                13: "You don't have permission to access that port.",
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
                98: "That port is already in use.",
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
                99: "That IP address can't be assigned-to.",
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
            }
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
            try:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
                error_text = ERRORS[e.args[0].args[0]]
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
            except (AttributeError, KeyError):
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
                error_text = str(e)
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
            sys.stderr.write(self.style.ERROR("Error: %s" % error_text) + '\n')
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
            # Need to use an OS exit because sys.exit doesn't work in a thread
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
        except KeyboardInterrupt:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
            if shutdown_message:
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
                print shutdown_message
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
83b28fc0d731 improve on ldt test framework
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79