web/lib/django_extensions/management/commands/runserver_plus.py
changeset 3 526ebd3988b0
equal deleted inserted replaced
1:ebaad720f88b 3:526ebd3988b0
       
     1 from django.core.management.base import BaseCommand, CommandError
       
     2 from optparse import make_option
       
     3 import os
       
     4 import sys
       
     5 
       
     6 def null_technical_500_response(request, exc_type, exc_value, tb):
       
     7     raise exc_type, exc_value, tb
       
     8 
       
     9 class Command(BaseCommand):
       
    10     option_list = BaseCommand.option_list + (
       
    11         make_option('--noreload', action='store_false', dest='use_reloader', default=True,
       
    12             help='Tells Django to NOT use the auto-reloader.'),
       
    13         make_option('--browser', action='store_true', dest='open_browser',
       
    14             help='Tells Django to open a browser.'),
       
    15         make_option('--adminmedia', dest='admin_media_path', default='',
       
    16             help='Specifies the directory from which to serve admin media.'),
       
    17     )
       
    18     help = "Starts a lightweight Web server for development."
       
    19     args = '[optional port number, or ipaddr:port]'
       
    20 
       
    21     # Validation is called explicitly each time the server is reloaded.
       
    22     requires_model_validation = False
       
    23 
       
    24     def handle(self, addrport='', *args, **options):
       
    25         import django
       
    26         from django.core.servers.basehttp import run, AdminMediaHandler, WSGIServerException
       
    27         from django.core.handlers.wsgi import WSGIHandler
       
    28         try:
       
    29             from werkzeug import run_simple, DebuggedApplication
       
    30         except:
       
    31             raise CommandError("Werkzeug is required to use runserver_plus.  Please visit http://werkzeug.pocoo.org/download")
       
    32 
       
    33         # usurp django's handler
       
    34         from django.views import debug
       
    35         debug.technical_500_response = null_technical_500_response
       
    36 
       
    37         if args:
       
    38             raise CommandError('Usage is runserver %s' % self.args)
       
    39         if not addrport:
       
    40             addr = ''
       
    41             port = '8000'
       
    42         else:
       
    43             try:
       
    44                 addr, port = addrport.split(':')
       
    45             except ValueError:
       
    46                 addr, port = '', addrport
       
    47         if not addr:
       
    48             addr = '127.0.0.1'
       
    49 
       
    50         if not port.isdigit():
       
    51             raise CommandError("%r is not a valid port number." % port)
       
    52 
       
    53         use_reloader = options.get('use_reloader', True)
       
    54         open_browser = options.get('open_browser', False)
       
    55         admin_media_path = options.get('admin_media_path', '')
       
    56         shutdown_message = options.get('shutdown_message', '')
       
    57         quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C'
       
    58 
       
    59         def inner_run():
       
    60             from django.conf import settings
       
    61             print "Validating models..."
       
    62             self.validate(display_num_errors=True)
       
    63             print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE)
       
    64             print "Development server is running at http://%s:%s/" % (addr, port)
       
    65             print "Using the Werkzeug debugger (http://werkzeug.pocoo.org/)"
       
    66             print "Quit the server with %s." % quit_command
       
    67             path = admin_media_path or django.__path__[0] + '/contrib/admin/media'
       
    68             handler = AdminMediaHandler(WSGIHandler(), path)
       
    69             if open_browser:
       
    70                 import webbrowser
       
    71                 url = "http://%s:%s/" % (addr, port)
       
    72                 webbrowser.open(url)
       
    73             run_simple(addr, int(port), DebuggedApplication(handler, True), 
       
    74                        use_reloader=use_reloader, use_debugger=True)            
       
    75         inner_run()