文章目录
下载和安装
打开pycharm,在terminal中输入 pip install bottle
支持python2.7 和python3
基础知识
Bottle是一个快速,简单,轻量级的 Python WSGI Web框架。单一文件,只依赖 Python标准库 。
服务器: 内置HTTP开发服务器并支持 paste, fapws3, bjoern, gae, cherrypy 或其他 WSGI 支持HTTP服务器。
第一个Hello world
在pycharm中新建一个python file,然后运行这个文件。
在浏览器中输入http://localhost:8080/hello/world
from bottle import route,run,template
@route('/hello/<name>')
def index(name):
return template('<b>Hello {{name}}</b>!',name=name)
run(host='localhost',port=8888)
原理解释
这个 route() decorator将一段代码绑定到URL路径。在本例中,我们将 /hello 路径到 hello() 功能。这叫@ route (因此是装饰名)是这个框架最重要的概念。您可以定义任意数量的路由。每当浏览器请求URL时,都会调用关联函数,并将返回值发送回浏览器。就这么简单。
最后一行调用的 run() 函数启动了内置的开发服务器。
它监听 localhost 的8080端口并响应请求, Control-c 可将其关闭。
到目前为止,这个内置的开发服务器已经足够用于日常的开发测试了。它根本不需要安装,就可以让你的应用跑起来。在教程的后面,你将学会如何让你的应用跑在其他服务器上面(译者注:内置服务器不能满足生产环境的要求)【还是要学会将这个项目部署到其他的服务器上】
调试模式(Debug =1) 在早期开发的时候非常有用,但请务必记得,在生产环境中将其关闭。
第二个Helloworld
和第一个执行过程一样,在浏览器的地址栏中输入:http://localhost:8080/hello
from bottle import route, run
@route('/hello')
def hello():
return "Hello World!"
run(host='localhost', port=8080, debug=True)
默认应用
基于简单性考虑,这份教程中的大部分例子都使用一个模块层面的 route() 修饰器函数来定义route。这样的话,所有route都添加到了一个全局的“默认应用”里面,即是在第一次调用 route() 函数时,创建的一个 Bottle 类的实例。其他几个模块层面的修饰器函数都与这个“默认应用”有关,如果你偏向于面向对象的做法且不介意多打点字,你可以创建一个独立的应用对象,这样就可避免使用全局范围的“默认应用”。
from bottle import Bottle, run
app = Bottle()
@app.route('/hello')
def hello():
return "Hello World!"
run(app, host='localhost', port=8080)
URL映射
这个 route() decorator将URL路径链接到回调函数,并向 default application . 但是,只有一条路径的应用程序有点无聊。我们再加一点(别忘了 from bottle import template ):
@route('/')
@route('/hello/<name>')
def greet(name='Stranger'):
return template('Hello {{name}}, how are you?', name=name)
说明:一个回调函数可以绑定多个route,你也可以在URL中添加通配符,然后在回调函数中使用他们。
动态的URL映射
包含通配符的route,我们称之为动态route(与之对应的是静态route),它能匹配多个URL地址。
一个通配符包含在一对尖括号里面(像这样 ),通配符之间用"/"分隔开来。例如,将URL定义为 /hello/ 这样,那么它就能匹配 /hello/alice 和 /hello/bob 这样的浏览器请求,但不能匹配 /hello , /hello/ 和 /hello/mr/smith 。
# URL中的通配符都会当作参数传给回调函数
# 直接在回调函数中使用。
# 这样可以漂亮地实现RESTful形式的URL。
# 例子如下:
@route('/wiki/<pagename>') # matches /wiki/Learning_Python
def show_wiki_page(pagename):
...
@route('/<action>/<user>') # matches /follow/defnull
def user_api(action, user):
...
已实现下面几种形式的过滤器,后续可能会继续添加:
:int 匹配一个数字,自动将其转换为int类型。
:float 与:int类似,用于浮点数。
:path 匹配一个路径(包含"/")
:re 匹配config部分的一个正则表达式,不更改被匹配到的值
@route('/object/<id:int>')
def callback(id):
assert isinstance(id, int)
@route('/show/<name:re:[a-z]+>')
def callback(name):
assert name.isalpha()
@route('/static/<path:path>')
def callback(path):
return static_file(path, ...)
HTTP的请求处理
-
HTTP 请求是通过Bottle对象的__call__方法完成的:
-
HTTP 协议有很多种请求方法。route默认使用GET方法,只响应GET请求。method参数可以给route()函数指定使用哪种方法。或用get(),post(),put()或delete()等函数来代替route()函数。
特殊请求方法: HEAD 和 ANY
HEAD 方法类似于 GET 方法,但服务器不会返回 HTTP 响应正文,一般用于获取 HTTP 原数据而不用下载整个页面。
非标准的ANY方法做为一个低优先级的fallback:在没有其它route的时候,监听ANY方法的route会匹配所有请求,而不管请求的方法是什么。这对于用做代理的route很有用,可将所有请求都重定向给子应用。
总之:HEAD 请求被响应GET请求的route来处理,响应 ANY 请求的 route 处理所有请求,但仅限于没有其它 route 来匹配原先的请求的情况。