pythoncamp0

Bottle

简单说,Bottle 的使用就是将变量传递给脚本,不过这里的参数包是 URL 请求地址,我们要做的就是写一个脚本,可以将其解包接受参数,经对应回调函数运行后,返回值发送至浏览器。

Bottle——一个微型 Python Web 框架


  • 只有一个文件

  • 不依赖第三方扩展库

  • 使用 Python 语言编写

  • 符合 WSGI 规范

  • 根据 URL 参数转发请求(映射),模板,key/value数据库

  • 内置多种第三方 WSGI/HTTP 服务器适配器和模板引擎

    • 小拓展: WSGI(Web Server Gateway Interface)是什么?
      是一种接口规范,用于服务器和客户端交互                
      不是服务器       
      不是 API       
      不是 Python 模块
      不是框架(不像 Bottle)
      
      在 WSGI 规范下,web 组件被分成三类:client, server, middleware.
      WSGI apps(服从该规范的应用)能够被连接起来(be stacked)处理一个request,这也就引发了中间件这个概念,中间件同时实现c端和s端的接口,c看它是上游s,s看它是下游的c。
      WSGI的s端所做的工作仅仅是接收请求,传给application(做处理),然后将结果response给middleware或client.除此以外的工作都交给中间件或者application来做。
      

Bottle 中的几个主要概念


  • 路由(Routing):将请求映射到函数,可以创建十分优雅的 URL

  • 模板(Templates):Pythonic 并且快速的 Python 内置模板引擎,同时还支持 mako, jinja2, cheetah 等第三方模板引擎

  • 工具集(Utilites):快速的读取 form 数据,上传文件,访问 cookies,headers 或者其它 HTTP 相关的 metadata

  • 服务器(Server):内置HTTP开发服务器,并且支持 paste, fapws3, bjoern, Google App Engine, Cherrypy 或者其它任何 WSGI HTTP 服务器

安装或依赖


Python 版本要求 2.5+ 或 3.x。

  • 在命令行中使用easy_install bottle进行安装。

  • Bottle 被设计为仅仅只有一个文件,我们甚至可以不安装它,直接将 bottle.py 文件下载并复制到我们的应用中就可以使用了,即下载 bottle.py 到你工作目录下。

??????

如果我们直接将 bottle.py 下载到自己的应用中的话,我们可以建立下面这样的目录结构:

+application

+----bottle.py

+----app.py

示例:Bottle 的 “Hello World” 程序


方法一:

将下面 Bottle 实例的示例代码复制到一个名为 app.py 文件中,在命令行输入 python app.py 运行该文件。

 from bottle import route, run

 @route('/')
 def index():
     return 'Hello World!'

 run(host='localhost', port=8080)

访问 http://localhost:8080/,得到一个“Hello World!”页面。

方法二:

我们将用控制行来创建一个十分简单但完整的 Bottle 应用程序。在 Python 控制台中逐行输入如下代码:

>>> from bottle import route, run
>>> @route('/hello/:name')
... def index(name = 'World'):
...     return '<strong>Hello {}!'.format(name)
... 
>>> run(host='localhost',port=8080)
Bottle server starting up (using WSGIRefServer())...
Listening on http://localhost:8080/
Use Ctrl-C to quit.

在 Python Consle中输入上面的代码,我们就得到了一个最简单但完整的 Web 应用,

访问 http://localhost:8080/hello/World,会得到一个“Hello World!”页面。

也可以改成,访问 http://localhost:8080/hello/bottle,会得到一个“Hello bottle!”页面。

这里可以类比 Python 用 from sys import argv 传递参数的方式来理解。

  • 怎么做到的?
      首先,我们导入了两个 Bottle 的组件, route() 和 run() 函数

      route() 可以将一个函数与一个 URL 进行绑定,在上面的示例中,route 将 “/hello/:name’ 这个URL地址绑定到了 “index(name = ‘World’)” 这个函数上

      这个是一个关联到 “/hello” 的 handler function 或者 callback ,任何对 “/hello” 这个URL的请求都将被递交到这个函数中

      我们获得请求后,index() 函数返回简单的字符串

      最后,run() 函数启动服务器,并且我们设置它在 “localhost” 和 8080 端口上运行
方法三:

将方法二创建的 Bottle 示例代码(如下所示)复制到一个名为 app1.py 文件中,在命令行输入 python app1.py 运行该文件。

from bottle import route, run

@route('/hello/:name')
def index(name = 'World'):
    return '<strong>Hello {}!'.format(name)

run(host='localhost',port=8080)

同样,访问 http://localhost:8080/hello/World ,会得到与方法二一样结果。

方法四:

我们也可以直接创建一个 Bottle 对象 app,将所有的函数都映射到 app 的 URL 地址上。 如上示例,我们可以用下面这种办法来实现:

将下面的 Bottle 示例代码复制到一个名为 app2.py 文件中,在命令行输入 python app2.py 运行该文件。

from bottle import Bottle, run

app = Bottle()
@app.route('/hello')
def hello():
    return "Hello World!"
run(app, host='localhost', port=8080)

访问 http://localhost:8080/hello,得到一个“Hello World!”页面。

拓展学习:微型 Python Web 框架:Bottle