from: http://onlypython.group.iteye.com/group/wiki/1516-use-cherrypy-as-django-s-development-server
該多線程是指多線程development server
1.
修改Django自帶的Development Server為多線程模式,這其實只需要改幾行代碼就可以了。(詳見http://code.djangoproject.com/ticket/3357 )
打開文件 django/core/servers/basehttp.py
第10行:
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
修改為
from BaseHTTPServer import BaseHTTPRequestHandler
在所有的 import 語句之後加上以下代碼:
- import BaseHTTPServer, SocketServer
- class HTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):
- def __init__(self, server_address, RequestHandlerClass=None):
- BaseHTTPServer.HTTPServer.__init__(self, server_address, RequestHandlerClass)
是的,這樣就可以了。 但是他還有一個小問題就是它不是線程安全的。可能在請求很多時會出現數據不同步,當然,這一般不是問題,因為我們通常只在自己機器上調試時才用Development Server。
2.
使用CherryPy 作為 Development Server
在安裝好CherryPy 之後,將以下代碼保存為文件runservercp.py
- from django.core.management.base import BaseCommand, CommandError
- from optparse import make_option
- import os, sys
- import cherrypy
- from cherrypy import wsgiserver
- class Command(BaseCommand):
- option_list = BaseCommand.option_list + (
- make_option('--noreload', action='store_false', dest='use_reloader', default=True,
- help='Tells Django to NOT use the auto-reloader.'),
- make_option('--adminmedia', dest='admin_media_path', default='',
- help='Specifies the directory from which to serve admin media.'),
- )
- help = "Starts a lightweight Web server for development."
- args = '[optional port number, or ipaddr:port]'
- # Validation is called explicitly each time the server is reloaded.
- requires_model_validation = False
- def handle(self, addrport='', *args, **options):
- import django
- from django.core.servers.basehttp import AdminMediaHandler
- from django.core.handlers.wsgi import WSGIHandler
- if args:
- raise CommandError('Usage is runservercp %s' % self.args)
- if not addrport:
- addr = ''
- port = '8000'
- else:
- try:
- addr, port = addrport.split(':')
- except ValueError:
- addr, port = '', addrport
- if not addr:
- addr = '127.0.0.1'
- if not port.isdigit():
- raise CommandError("%r is not a valid port number." % port)
- use_reloader = options.get('use_reloader', True)
- admin_media_path = options.get('admin_media_path', '')
- shutdown_message = options.get('shutdown_message', '')
- quit_command = (sys.platform == 'win32') and 'CTRL-BREAK' or 'CONTROL-C'
- def inner_run():
- from django.conf import settings
- from django.utils import translation
- print "\nValidating models..."
- self.validate(display_num_errors=True)
- print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE)
- print "Development server is running at http://%s:%s/" % (addr, port)
- print "Quit the server with %s." % 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:
- path = admin_media_path or django.__path__[0] + '/contrib/admin/media'
- handler = AdminMediaHandler(WSGIHandler(), path)
- cherrypy.config.update({
- 'server.socket_host': addr,
- 'server.socket_port': int(port),
- 'engine.autoreload_on': use_reloader
- })
- cherrypy.tree.graft(handler, '/')
- cherrypy.engine.start()
- cherrypy.engine.block()
- finally:
- if shutdown_message:
- print shutdown_message
- cherrypy.engine.exit()
- inner_run()
將該文件放到djang源代碼目錄 django\core\management\commands 下,這樣運行命令
python manage.py runservercp
時就使用了CherryPy 作為服務器了,其中命令名是根據文件的名字而定的,因為該文件保存為runservercp.py,所以命令名為 runservercp。
另外放在django的源代碼目錄的好處是所有的django project都可以使用該命令使用到CherryPy 。