現在的位置: 首頁 > 綜合 > 正文

django 多線程

2013年07月08日 ⁄ 綜合 ⁄ 共 4312字 ⁄ 字號 評論關閉

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 語句之後加上以下代碼:

Python代碼  收藏代碼
  1. import BaseHTTPServer, SocketServer  
  2. class HTTPServer(SocketServer.ThreadingMixIn, BaseHTTPServer.HTTPServer):    
  3.     def __init__(self, server_address, RequestHandlerClass=None):    
  4.         BaseHTTPServer.HTTPServer.__init__(self, server_address, RequestHandlerClass)  

 

是的,這樣就可以了。 但是他還有一個小問題就是它不是線程安全的。可能在請求很多時會出現數據不同步,當然,這一般不是問題,因為我們通常只在自己機器上調試時才用Development Server。

2.

使用CherryPy 作為 Development Server

在安裝好CherryPy 之後,將以下代碼保存為文件runservercp.py

Python代碼  收藏代碼
  1. from django.core.management.base import BaseCommand, CommandError  
  2. from optparse import make_option  
  3. import os, sys  
  4. import cherrypy  
  5. from cherrypy import wsgiserver  
  6. class Command(BaseCommand):  
  7.     option_list = BaseCommand.option_list + (  
  8.         make_option('--noreload', action='store_false', dest='use_reloader', default=True,  
  9.             help='Tells Django to NOT use the auto-reloader.'),  
  10.         make_option('--adminmedia', dest='admin_media_path', default='',  
  11.             help='Specifies the directory from which to serve admin media.'),  
  12.     )  
  13.     help = "Starts a lightweight Web server for development."  
  14.     args = '[optional port number, or ipaddr:port]'  
  15.   
  16.     # Validation is called explicitly each time the server is reloaded.  
  17.     requires_model_validation = False  
  18.   
  19.     def handle(self, addrport='', *args, **options):  
  20.         import django  
  21.         from django.core.servers.basehttp import AdminMediaHandler  
  22.         from django.core.handlers.wsgi import WSGIHandler  
  23.         if args:  
  24.             raise CommandError('Usage is runservercp %s' % self.args)  
  25.         if not addrport:  
  26.             addr = ''  
  27.             port = '8000'  
  28.         else:  
  29.             try:  
  30.                 addr, port = addrport.split(':')  
  31.             except ValueError:  
  32.                 addr, port = '', addrport  
  33.         if not addr:  
  34.             addr = '127.0.0.1'  
  35.   
  36.         if not port.isdigit():  
  37.             raise CommandError("%r is not a valid port number." % port)  
  38.   
  39.         use_reloader = options.get('use_reloader'True)  
  40.         admin_media_path = options.get('admin_media_path''')  
  41.         shutdown_message = options.get('shutdown_message''')  
  42.         quit_command = (sys.platform == 'win32'and 'CTRL-BREAK' or 'CONTROL-C'  
  43.           
  44.         def inner_run():  
  45.             from django.conf import settings  
  46.             from django.utils import translation  
  47.             print "\nValidating models..."  
  48.             self.validate(display_num_errors=True)  
  49.             print "\nDjango version %s, using settings %r" % (django.get_version(), settings.SETTINGS_MODULE)  
  50.             print "Development server is running at http://%s:%s/" % (addr, port)  
  51.             print "Quit the server with %s." % quit_command  
  52.               
  53.             # django.core.management.base forces the locale to en-us. We should  
  54.             # set it up correctly for the first request (particularly important  
  55.             # in the "--noreload" case).  
  56.             translation.activate(settings.LANGUAGE_CODE)  
  57.               
  58.             try:  
  59.                 path = admin_media_path or django.__path__[0] + '/contrib/admin/media'  
  60.                 handler = AdminMediaHandler(WSGIHandler(), path)  
  61.                 cherrypy.config.update({  
  62.                         'server.socket_host': addr,  
  63.                         'server.socket_port': int(port),  
  64.                         'engine.autoreload_on':  use_reloader  
  65.                     })  
  66.       
  67.                 cherrypy.tree.graft(handler, '/')  
  68.       
  69.                 cherrypy.engine.start()  
  70.                 cherrypy.engine.block()  
  71.             finally:  
  72.                 if shutdown_message:  
  73.                     print shutdown_message  
  74.                 cherrypy.engine.exit()  
  75.         inner_run()  

 

將該文件放到djang源代碼目錄 django\core\management\commands 下,這樣運行命令

python manage.py runservercp

時就使用了CherryPy 作為服務器了,其中命令名是根據文件的名字而定的,因為該文件保存為runservercp.py,所以命令名為 runservercp。

另外放在django的源代碼目錄的好處是所有的django project都可以使用該命令使用到CherryPy 。

抱歉!評論已關閉.