Вам нужно создать каcтомную команду runserver. Сделал для разминки, она выглядит как-то так:
"""
Custom runserver command that logs out urlunquoted strings to console.
"""
import os
import sys
from datetime import datetime
from django.core.servers.basehttp import (WSGIRequestHandler, WSGIServer,
WSGIServerException)
from django.core.management.commands import runserver
from django.utils.six.moves import socketserver
from django.utils.http import urlunquote
class CustomLoggingWSGIRequestHandler(WSGIRequestHandler):
def log_message(self, format, *args):
"""
Heads up. Customized log method.
"""
args = list(args)
args[0] = urlunquote(args[0])
return super(CustomLoggingWSGIRequestHandler, self).log_message(
format, *args)
def run(addr, port, wsgi_handler, ipv6=False, threading=False):
server_address = (addr, port)
if threading:
httpd_cls = type(str('WSGIServer'), (socketserver.ThreadingMixIn,
WSGIServer), {})
else:
httpd_cls = WSGIServer
httpd = httpd_cls(server_address, CustomLoggingWSGIRequestHandler,
ipv6=ipv6)
httpd.set_app(wsgi_handler)
httpd.serve_forever()
class Command(runserver.Command):
"""
Custom runserver command that utilizes CustomLoggingWSGIRequestHandler.
"""
def inner_run(self, *args, **options):
from django.conf import settings
from django.utils import translation
threading = options.get('use_threading')
shutdown_message = options.get('shutdown_message', '')
quit_command = ['CONTROL-C', 'CTRL-BREAK'][sys.platform == 'win32']
self.stdout.write("Validating models...\n\n")
self.validate(display_num_errors=True)
self.stdout.write((
"%(started_at)s\n"
"Django version %(version)s, using settings %(settings)r\n"
"Development server is running at http://%(addr)s:%(port)s/\n"
"Quit the server with %(quit_command)s.\n"
) % {
"started_at": datetime.now().strftime('%B %d, %Y - %X'),
"version": self.get_version(),
"settings": settings.SETTINGS_MODULE,
"addr": self._raw_ipv6 and '[%s]' % self.addr or self.addr,
"port": self.port,
"quit_command": quit_command,
})
# django.core.management.base forces the locale to en-us. We should
# set it up correctly for the first request (particularly important
# in the "--noreload" case).
translation.activate(settings.LANGUAGE_CODE)
try:
handler = self.get_handler(*args, **options)
run(self.addr, int(self.port), handler,
ipv6=self.use_ipv6, threading=threading)
except WSGIServerException 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.",
}
try:
error_text = ERRORS[e.args[0].args[0]]
except (AttributeError, 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
os._exit(1)
except KeyboardInterrupt:
if shutdown_message:
self.stdout.write(shutdown_message)
sys.exit(0)