From ce165f7bbf0c481a20db6b4b9f764b8bb89348ba Mon Sep 17 00:00:00 2001 From: Jannis Leidel Date: Fri, 17 Jun 2011 13:08:36 +0000 Subject: [PATCH] Fixed #16099 -- Enabled threading for the runserver management command and added a --nothreading option to disable it if needed. This should help Google Chrome users because it opens more than one connection speculatively. git-svn-id: http://code.djangoproject.com/svn/django/trunk@16427 bcc190cf-cafb-0310-a4f2-bffc1f526a37 --- django/core/management/commands/runserver.py | 7 ++++++- django/core/servers/basehttp.py | 9 +++++++-- docs/man/django-admin.1 | 5 ++++- docs/ref/django-admin.txt | 7 +++++++ 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/django/core/management/commands/runserver.py b/django/core/management/commands/runserver.py index b265740359..2e7ad1cd05 100644 --- a/django/core/management/commands/runserver.py +++ b/django/core/management/commands/runserver.py @@ -17,10 +17,13 @@ naiveip_re = re.compile(r"""^(?: ):)?(?P\d+)$""", re.X) DEFAULT_PORT = "8000" + class BaseRunserverCommand(BaseCommand): option_list = BaseCommand.option_list + ( make_option('--ipv6', '-6', action='store_true', dest='use_ipv6', default=False, help='Tells Django to use a IPv6 address.'), + make_option('--nothreading', action='store_false', dest='use_threading', default=True, + help='Use threading for web server.'), make_option('--noreload', action='store_false', dest='use_reloader', default=True, help='Tells Django to NOT use the auto-reloader.'), ) @@ -81,6 +84,7 @@ class BaseRunserverCommand(BaseCommand): from django.conf import settings from django.utils import translation + threading = options.get('use_threading', False) shutdown_message = options.get('shutdown_message', '') quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C' @@ -104,7 +108,8 @@ class BaseRunserverCommand(BaseCommand): try: handler = self.get_handler(*args, **options) - run(self.addr, int(self.port), handler, ipv6=self.use_ipv6) + run(self.addr, int(self.port), handler, + ipv6=self.use_ipv6, threading=threading) except WSGIServerException, e: # Use helpful error messages instead of ugly tracebacks. ERRORS = { diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py index b51abcf450..c4c45111fb 100644 --- a/django/core/servers/basehttp.py +++ b/django/core/servers/basehttp.py @@ -12,6 +12,7 @@ import socket import sys import traceback import urllib +from SocketServer import ThreadingMixIn from wsgiref import simple_server from wsgiref.util import FileWrapper # for backwards compatibility @@ -205,8 +206,12 @@ class AdminMediaHandler(handlers.StaticFilesHandler): return path.startswith(self.base_url[2]) and not self.base_url[1] -def run(addr, port, wsgi_handler, ipv6=False): +def run(addr, port, wsgi_handler, ipv6=False, threading=False): server_address = (addr, port) - httpd = WSGIServer(server_address, WSGIRequestHandler, ipv6=ipv6) + if threading: + httpd_cls = type('WSGIServer', (ThreadingMixIn, WSGIServer), {}) + else: + httpd_cls = WSGIServer + httpd = httpd_cls(server_address, WSGIRequestHandler, ipv6=ipv6) httpd.set_app(wsgi_handler) httpd.serve_forever() diff --git a/docs/man/django-admin.1 b/docs/man/django-admin.1 index 73815ef68b..62e45ae50e 100644 --- a/docs/man/django-admin.1 +++ b/docs/man/django-admin.1 @@ -75,7 +75,7 @@ Runs this project as a FastCGI application. Requires flup. Use .B runfcgi help for help on the KEY=val pairs. .TP -.BI "runserver [" "\-\-noreload" "] [" "\-\-nostatic" "] [" "\-\-insecure" "] [" "\-\-ipv6" "] [" "\-\-adminmedia=ADMIN_MEDIA_PATH" "] [" "port|ipaddr:port" "]" +.BI "runserver [" "\-\-noreload" "] [" "\-\-nothreading" "] [" "\-\-nostatic" "] [" "\-\-insecure" "] [" "\-\-ipv6" "] [" "\-\-adminmedia=ADMIN_MEDIA_PATH" "] [" "port|ipaddr:port" "]" Starts a lightweight Web server for development. .TP .BI "shell [" "\-\-plain" "]" @@ -167,6 +167,9 @@ Disable the development server's auto\-reloader. .I \-\-nostatic Disable automatic serving of static files from STATIC_URL. .TP +.I \-\-nothreading +Disable the development server's threading. +.TP .I \-\-insecure Enables serving of static files even if DEBUG is False. .TP diff --git a/docs/ref/django-admin.txt b/docs/ref/django-admin.txt index 812a82e208..0b116f8c23 100644 --- a/docs/ref/django-admin.txt +++ b/docs/ref/django-admin.txt @@ -688,6 +688,13 @@ Example usage:: django-admin.py runserver --noreload +.. django-admin-option:: --nothreading + +.. versionadded:: 1.4 + +Use the ``--nothreading`` option to disable the use of threading in the +development server. + .. django-admin-option:: --ipv6, -6 .. versionadded:: 1.3