diff --git a/django/core/management/commands/runserver.py b/django/core/management/commands/runserver.py index 391e0b440a..740764d5bd 100644 --- a/django/core/management/commands/runserver.py +++ b/django/core/management/commands/runserver.py @@ -1,12 +1,13 @@ from optparse import make_option from datetime import datetime +import errno import os import re import sys import socket from django.core.management.base import BaseCommand, CommandError -from django.core.servers.basehttp import run, WSGIServerException, get_internal_wsgi_application +from django.core.servers.basehttp import run, get_internal_wsgi_application from django.utils import autoreload naiveip_re = re.compile(r"""^(?: @@ -112,16 +113,16 @@ class Command(BaseCommand): handler = self.get_handler(*args, **options) run(self.addr, int(self.port), handler, ipv6=self.use_ipv6, threading=threading) - except WSGIServerException as e: + except socket.error as 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.", + errno.EACCES: "You don't have permission to access that port.", + errno.EADDRINUSE: "That port is already in use.", + errno.EADDRNOTAVAIL: "That IP address can't be assigned-to.", } try: - error_text = ERRORS[e.args[0].args[0]] - except (AttributeError, KeyError): + error_text = ERRORS[e.errno] + except KeyError: error_text = str(e) self.stderr.write("Error: %s" % error_text) # Need to use an OS exit because sys.exit doesn't work in a thread diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py index 68ca0c1079..9aed63774d 100644 --- a/django/core/servers/basehttp.py +++ b/django/core/servers/basehttp.py @@ -67,10 +67,6 @@ def get_internal_wsgi_application(): return app -class WSGIServerException(Exception): - pass - - class ServerHandler(simple_server.ServerHandler, object): error_status = str("500 INTERNAL SERVER ERROR") @@ -131,10 +127,7 @@ class WSGIServer(simple_server.WSGIServer, object): def server_bind(self): """Override server_bind to store the server name.""" - try: - super(WSGIServer, self).server_bind() - except Exception as e: - raise WSGIServerException(e) + super(WSGIServer, self).server_bind() self.setup_environ() diff --git a/django/test/testcases.py b/django/test/testcases.py index 0941fa09d1..99f979494a 100644 --- a/django/test/testcases.py +++ b/django/test/testcases.py @@ -4,6 +4,7 @@ import difflib import json import os import re +import socket import sys from copy import copy from functools import wraps @@ -24,8 +25,7 @@ from django.core.handlers.wsgi import WSGIHandler from django.core.management import call_command from django.core.management.color import no_style from django.core.signals import request_started -from django.core.servers.basehttp import (WSGIRequestHandler, WSGIServer, - WSGIServerException) +from django.core.servers.basehttp import WSGIRequestHandler, WSGIServer from django.core.urlresolvers import clear_url_caches from django.core.validators import EMPTY_VALUES from django.db import (transaction, connection, connections, DEFAULT_DB_ALIAS, @@ -1064,10 +1064,9 @@ class LiveServerThread(threading.Thread): try: self.httpd = StoppableWSGIServer( (self.host, port), QuietWSGIRequestHandler) - except WSGIServerException as e: + except socket.error as e: if (index + 1 < len(self.possible_ports) and - hasattr(e.args[0], 'errno') and - e.args[0].errno == errno.EADDRINUSE): + e.errno == errno.EADDRINUSE): # This port is already in use, so we go on and try with # the next one in the list. continue diff --git a/tests/regressiontests/servers/tests.py b/tests/regressiontests/servers/tests.py index 4495596dfa..8bf13127ee 100644 --- a/tests/regressiontests/servers/tests.py +++ b/tests/regressiontests/servers/tests.py @@ -5,6 +5,7 @@ Tests for django.core.servers. from __future__ import unicode_literals import os +import socket try: from urllib.request import urlopen, HTTPError except ImportError: # Python 2 @@ -12,7 +13,6 @@ except ImportError: # Python 2 from django.core.exceptions import ImproperlyConfigured from django.test import LiveServerTestCase -from django.core.servers.basehttp import WSGIServerException from django.test.utils import override_settings from django.utils.http import urlencode from django.utils._os import upath @@ -66,7 +66,7 @@ class LiveServerAddress(LiveServerBase): cls.raises_exception('localhost', ImproperlyConfigured) # The host must be valid - cls.raises_exception('blahblahblah:8081', WSGIServerException) + cls.raises_exception('blahblahblah:8081', socket.error) # The list of ports must be in a valid format cls.raises_exception('localhost:8081,', ImproperlyConfigured)