app/django/core/management/commands/runserver.py
changeset 54 03e267d67478
child 323 ff1a9aa48cfd
equal deleted inserted replaced
53:57b4279d8c4e 54:03e267d67478
       
     1 from django.core.management.base import BaseCommand, CommandError
       
     2 from optparse import make_option
       
     3 import os
       
     4 import sys
       
     5 
       
     6 class Command(BaseCommand):
       
     7     option_list = BaseCommand.option_list + (
       
     8         make_option('--noreload', action='store_false', dest='use_reloader', default=True,
       
     9             help='Tells Django to NOT use the auto-reloader.'),
       
    10         make_option('--adminmedia', dest='admin_media_path', default='',
       
    11             help='Specifies the directory from which to serve admin media.'),
       
    12     )
       
    13     help = "Starts a lightweight Web server for development."
       
    14     args = '[optional port number, or ipaddr:port]'
       
    15 
       
    16     # Validation is called explicitly each time the server is reloaded.
       
    17     requires_model_validation = False
       
    18 
       
    19     def handle(self, addrport='', *args, **options):
       
    20         import django
       
    21         from django.core.servers.basehttp import run, AdminMediaHandler, WSGIServerException
       
    22         from django.core.handlers.wsgi import WSGIHandler
       
    23         if args:
       
    24             raise CommandError('Usage is runserver %s' % self.args)
       
    25         if not addrport:
       
    26             addr = ''
       
    27             port = '8000'
       
    28         else:
       
    29             try:
       
    30                 addr, port = addrport.split(':')
       
    31             except ValueError:
       
    32                 addr, port = '', addrport
       
    33         if not addr:
       
    34             addr = '127.0.0.1'
       
    35 
       
    36         if not port.isdigit():
       
    37             raise CommandError("%r is not a valid port number." % port)
       
    38 
       
    39         use_reloader = options.get('use_reloader', True)
       
    40         admin_media_path = options.get('admin_media_path', '')
       
    41         shutdown_message = options.get('shutdown_message', '')
       
    42         quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C'
       
    43 
       
    44         def inner_run():
       
    45             from django.conf import settings
       
    46             print "Validating models..."
       
    47             self.validate(display_num_errors=True)
       
    48             print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE)
       
    49             print "Development server is running at http://%s:%s/" % (addr, port)
       
    50             print "Quit the server with %s." % quit_command
       
    51             try:
       
    52                 path = admin_media_path or django.__path__[0] + '/contrib/admin/media'
       
    53                 handler = AdminMediaHandler(WSGIHandler(), path)
       
    54                 run(addr, int(port), handler)
       
    55             except WSGIServerException, e:
       
    56                 # Use helpful error messages instead of ugly tracebacks.
       
    57                 ERRORS = {
       
    58                     13: "You don't have permission to access that port.",
       
    59                     98: "That port is already in use.",
       
    60                     99: "That IP address can't be assigned-to.",
       
    61                 }
       
    62                 try:
       
    63                     error_text = ERRORS[e.args[0].args[0]]
       
    64                 except (AttributeError, KeyError):
       
    65                     error_text = str(e)
       
    66                 sys.stderr.write(self.style.ERROR("Error: %s" % error_text) + '\n')
       
    67                 # Need to use an OS exit because sys.exit doesn't work in a thread
       
    68                 os._exit(1)
       
    69             except KeyboardInterrupt:
       
    70                 if shutdown_message:
       
    71                     print shutdown_message
       
    72                 sys.exit(0)
       
    73         if use_reloader:
       
    74             from django.utils import autoreload
       
    75             autoreload.main(inner_run)
       
    76         else:
       
    77             inner_run()