Python的Bottle框架基本知识总结

2019-10-17 20:23:32丽君

Example

 

from bottle import default_app, run
app = default_app()
newapp = YourMiddleware(app)
run(app=newapp)

from bottle import route, db
@route('/db/counter')
def db_counter():
  if 'hits' not in db.counter:
    db.counter.hits = 0
  db['counter']['hits'] += 1
  return "Total hits: %d!" % db.counter.hits

使用WSGI和中间件

bottle.default_app()返回一个WSGI应用.如果喜欢WSGI中间件模块的话,你只需要声明bottle.run()去包装应用,而不是使用默认的.

默认default_app()工作

Bottle创建一个bottle.Bottle()对象和装饰器,调用bottle.run()运行. bottle.default_app()是默认.当然你可以创建自己的bottle.Bottle()实例.

from bottle import Bottle, run
mybottle = Bottle()
@mybottle.route('/')
def index():
 return 'default_app'
run(app=mybottle)

发布

Bottle默认使用wsgiref.SimpleServer发布.这个默认单线程服务器是用来早期开发和测试,但是后期可能会成为性能瓶颈.

有三种方法可以去修改:

        使用多线程的适配器     负载多个Bottle实例应用     或者两者

多线程服务器

最简单的方法是安装一个多线程和WSGI规范的HTTP服务器比如Paste, flup, cherrypy or fapws3并使用相应的适配器.
 

from bottle import PasteServer, FlupServer, FapwsServer, CherryPyServer
bottle.run(server=PasteServer) # Example

如果缺少你喜欢的服务器和适配器,你可以手动修改HTTP服务器并设置bottle.default_app()来访问你的WSGI应用.
 

def run_custom_paste_server(self, host, port):
  myapp = bottle.default_app()
  from paste import httpserver
  httpserver.serve(myapp, host=host, port=port)

多服务器进程

一个Python程序只能使用一次一个CPU,即使有更多的CPU.关键是要利用CPU资源来负载平衡多个独立的Python程序.

单实例Bottle应用,你可以通过不同的端口来启动(localhost:8080, 8081, 8082, ...).高性能负载作为反向代理和远期每一个随机瓶进程的新要求,平衡器的行为,传播所有可用的支持与服务器实例的负载.这样,您就可以使用所有的CPU核心,甚至分散在不同的物理服务器之间的负载。.

但也有点缺点:

    多个Python进程里不能共享数据.     同一时间可能需要大量内存来运行Python和Bottle应用和副本.

最快的一个负载是pound当然其他一些HTTP服务器同样可以做的很好.

不久我会加入lighttpd和Apache使用.
Apache mod_wsgi

发布你的应用当然不是用Bottle自带的方法,你可以再Apache server使用 mod_wsgi模板和Bottles WSGI接口.

你需要建立app.wsgi文件并提供 application对象.这个对象是用使用mod_wsgi启动你的程序并遵循WSGI规范可调用.