Bottle 框架源码学习 二
上一篇简单分析了route的基本用法
本篇分析一下run函数的运行原理
defrun(app=None,server='wsgiref',host='127.0.0.1',port=8080,interval=1,reloader=False,quiet=False,plugins=None,debug=None,**kargs):ifNORUN:returnifreloaderandnotos.environ.get('BOTTLE_CHILD'):try:lockfile=Nonefd,lockfile=tempfile.mkstemp(prefix='bottle.',suffix='.lock')os.close(fd)#Weonlyneedthisfiletoexist.Weneverwritetoitwhileos.path.exists(lockfile):args=[sys.executable]+sys.argvenviron=os.environ.copy()environ['BOTTLE_CHILD']='true'environ['BOTTLE_LOCKFILE']=lockfilep=subprocess.Popen(args,env=environ)whilep.poll()isNone:#Busywait...os.utime(lockfile,None)#Iamalive!time.sleep(interval)ifp.poll()!=3:ifos.path.exists(lockfile):os.unlink(lockfile)sys.exit(p.poll())exceptKeyboardInterrupt:passfinally:ifos.path.exists(lockfile):os.unlink(lockfile)returntry:ifdebugisnotNone:_debug(debug)app=appordefault_app()ifisinstance(app,basestring):app=load_app(app)ifnotcallable(app):raiseValueError("Applicationisnotcallable:%r"%app)forplugininpluginsor[]:app.install(plugin)ifserverinserver_names:server=server_names.get(server)ifisinstance(server,basestring):server=load(server)ifisinstance(server,type):server=server(host=host,port=port,**kargs)ifnotisinstance(server,ServerAdapter):raiseValueError("Unknownorunsupportedserver:%r"%server)server.quiet=server.quietorquietifnotserver.quiet:_stderr("Bottlev%sserverstartingup(using%s)...\n"%(__version__,repr(server)))_stderr("Listeningonhttp://%s:%d/\n"%(server.host,server.port))_stderr("HitCtrl-Ctoquit.\n\n")ifreloader:lockfile=os.environ.get('BOTTLE_LOCKFILE')bgcheck=FileCheckerThread(lockfile,interval)withbgcheck:server.run(app)ifbgcheck.status=='reload':sys.exit(3)else:server.run(app)exceptKeyboardInterrupt:passexcept(SystemExit,MemoryError):raiseexcept:ifnotreloader:raiseifnotgetattr(server,'quiet',quiet):print_exc()time.sleep(interval)sys.exit(3)
1.
ifreloaderandnotos.environ.get('BOTTLE_CHILD'):
这段代码作用是判断用户编辑了源码后,是否需要重新载入并运行bottle,先知道它的作用,具体细节暂时不看
2.看这一段
app=appordefault_app()ifisinstance(app,basestring):app=load_app(app)ifnotcallable(app):raiseValueError("Applicationisnotcallable:%r"%app)
如果不显式指定一个application对象,bottle会帮我们生成一个默认的application对象
如果提供的app是一个字符串,则会通过load_app返回一个application对象
3.
ifserverinserver_names:server=server_names.get(server)ifisinstance(server,basestring):server=load(server)ifisinstance(server,type):server=server(host=host,port=port,**kargs)ifnotisinstance(server,ServerAdapter):raiseValueError("Unknownorunsupportedserver:%r"%server)server.quiet=server.quietorquietifnotserver.quiet:_stderr("Bottlev%sserverstartingup(using%s)...\n"%(__version__,repr(server)))_stderr("Listeningonhttp://%s:%d/\n"%(server.host,server.port))_stderr("HitCtrl-Ctoquit.\n\n")ifreloader:lockfile=os.environ.get('BOTTLE_LOCKFILE')bgcheck=FileCheckerThread(lockfile,interval)withbgcheck:server.run(app)ifbgcheck.status=='reload':sys.exit(3)else:server.run(app)
如果不指定server(即实现wsgi协议的服务器程序),则会应用WSGIRefServer这个服务器程序
4.
server_names={'cgi':CGIServer,'flup':FlupFCGIServer,'wsgiref':WSGIRefServer,'waitress':WaitressServer,'cherrypy':CherryPyServer,'paste':PasteServer,'fapws3':FapwsServer,'tornado':TornadoServer,'gae':AppEngineServer,'twisted':TwistedServer,'diesel':DieselServer,'meinheld':MeinheldServer,'gunicorn':GunicornServer,'eventlet':EventletServer,'gevent':GeventServer,'geventSocketIO':GeventSocketIOServer,'rocket':RocketServer,'bjoern':BjoernServer,'auto':AutoServer,}
以上是bottle支持的servers
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。