关于django多线程问题解决

Django自带的Development Server作为调试开发时的临时服务器是一个非常方便的工具,因为避免了在还没有代码之前就需要配置一大堆环境的麻烦。

但是此服务器也有一个不足的地方就是它是单线程模式的,也就是同时只能处理一个请求,当需要调试ajax应用时,这就显得非常麻烦了,因为这经常需要同时处理多个请求。

经过搜索,查找,简单的解决方法有以下两种:

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. importBaseHTTPServer,SocketServer
  2. classHTTPServer(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. fromdjango.core.management.baseimportBaseCommand,CommandError
  2. fromoptparseimportmake_option
  3. importos,sys
  4. importcherrypy
  5. fromcherrypyimportwsgiserver
  6. classCommand(BaseCommand):
  7. option_list=BaseCommand.option_list+(
  8. make_option('--noreload',action='store_false',dest='use_reloader',default=True,
  9. help='TellsDjangotoNOTusetheauto-reloader.'),
  10. make_option('--adminmedia',dest='admin_media_path',default='',
  11. help='Specifiesthedirectoryfromwhichtoserveadminmedia.'),
  12. )
  13. help="StartsalightweightWebserverfordevelopment."
  14. args='[optionalportnumber,oripaddr:port]'
  15. #Validationiscalledexplicitlyeachtimetheserverisreloaded.
  16. requires_model_validation=False
  17. defhandle(self,addrport='',*args,**options):
  18. importdjango
  19. fromdjango.core.servers.basehttpimportAdminMediaHandler
  20. fromdjango.core.handlers.wsgiimportWSGIHandler
  21. ifargs:
  22. raiseCommandError('Usageisrunservercp%s'%self.args)
  23. ifnotaddrport:
  24. addr=''
  25. port='8000'
  26. else:
  27. try:
  28. addr,port=addrport.split(':')
  29. exceptValueError:
  30. addr,port='',addrport
  31. ifnotaddr:
  32. addr='127.0.0.1'
  33. ifnotport.isdigit():
  34. raiseCommandError("%risnotavalidportnumber."%port)
  35. use_reloader=options.get('use_reloader',True)
  36. admin_media_path=options.get('admin_media_path','')
  37. shutdown_message=options.get('shutdown_message','')
  38. quit_command=(sys.platform=='win32')and'CTRL-BREAK'or'CONTROL-C'
  39. definner_run():
  40. fromdjango.confimportsettings
  41. fromdjango.utilsimporttranslation
  42. print"\nValidatingmodels..."
  43. self.validate(display_num_errors=True)
  44. print"\nDjangoversion%s,usingsettings%r"%(django.get_version(),settings.SETTINGS_MODULE)
  45. print"Developmentserverisrunningathttp://%s:%s/"%(addr,port)
  46. print"Quittheserverwith%s."%quit_command
  47. #django.core.management.baseforcesthelocaletoen-us.Weshould
  48. #setitupcorrectlyforthefirstrequest(particularlyimportant
  49. #inthe"--noreload"case).
  50. translation.activate(settings.LANGUAGE_CODE)
  51. try:
  52. path=admin_media_pathordjango.__path__[0]+'/contrib/admin/media'
  53. handler=AdminMediaHandler(WSGIHandler(),path)
  54. cherrypy.config.update({
  55. 'server.socket_host':addr,
  56. 'server.socket_port':int(port),
  57. 'engine.autoreload_on':use_reloader
  58. })
  59. cherrypy.tree.graft(handler,'/')
  60. cherrypy.engine.start()
  61. cherrypy.engine.block()
  62. finally:
  63. ifshutdown_message:
  64. printshutdown_message
  65. cherrypy.engine.exit()
  66. inner_run()

将该文件放到djang源代码目录 django\core\management\commands 下,这样运行命令

python manage.py runservercp

时就使用了CherryPy 作为服务器了,其中命令名是根据文件的名字而定的,因为该文件保存为runservercp.py,所以命令名为 runservercp。

另外放在django的源代码目录的好处是所有的django project都可以使用该命令使用到CherryPy 。

另外一种放置方式是新建一个app,在该app下新建package management,再在该package下建另一package commands,将该文件放在commands 目录下(可参考django\contrib\auth 应用),同时在settings.py 中的INSTALLED_APPS 加上该app,那么该project 就可以使用该命令了。其他project不受影响。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值