## 1. 安装bottle
在终端环境中,使用以下命令安装bottle框架:
pip install bottle
## 2. 快速开始
下面是一个使用bottle框架编写的示例代码,包括了路由、请求和响应等内容:
from bottle import route, run
@route('/hello/:name')
def index(name='World'):
return 'Hello %s!' % name
run(host='localhost', port=8080, debug=True)
上面代码中,使用装饰器`@route`指定HTTP请求的路径,其中`name`为请求参数,可以通过参数传递到返回结果中,返回结果为`Hello World!`或者`Hello name!`,‘name’为参数值。
运行以上示例代码并在浏览器中输入 `http://localhost:8080/hello/bottle`,就会看到 `Hello Bottle!` 的输出结果。这就是一个bottle的web应用。
## 3. 路由与请求
在bottle框架中路由是一种映射关系,用于将用户请求的URL地址映射到对应的python函数上。在以上的示例代码中,使用了装饰器 `@route('/hello/:name')`,指定请求路径 `/hello/:name`。其中 `:name` 表示请求参数,可以通过参数传递到返回结果中。
### (1)常规路由
在bottle中,想要创建一个路由,通常有两种方式:
1.使用装饰器`@route`:
from bottle import route, run
@route('/my_route')
def my_handler():
return "Hello World!"
run(host='localhost', port=8080, debug=True)
2.使用`.route()`方法:
from bottle import Bottle
app = Bottle()
def my_handler():
return "Hello World!"
app.route('/my_route', method='GET', callback=my_handler)
app.run(host='localhost', port=8080, debug=True)
以上两种方式中都是可以达到同样的效果的,区别在于第二种方式,代码需要先实例化一个瓶子(`Bottle`)对象,来实现路由功能,即可在上面挂在后端代码的handler函数。默认开启的端口为8080。
### (2)路由参数
在Bottle中可以使用路由来处理参数。例如,我们可以使用路由来解析URL中的参数。下面是一个使用路由参数的示例代码:
from bottle import route, run
@route('/page/:name')
def handler(name='index'):
return '{0}
'.format(name)
run(host='localhost', port=8080, debug=True)
上面代码中在路径 `/page/:name` 中的`':name'`可以作为参数接受请求,如在浏览器中输入 `http://localhost:8080/page/Bottle`,则会输出`Bottle
`的HTML内容,`:name`作为参数传入并在结果中命名为`name`,默认值为 `index`。### (3)HTTP请求
HTTP请求是一个Web应用程序与Web服务器之间的通信协议,它是无状态的协议,请求无法记住任何先前的请求或响应。Bottle可以响应所有基本的HTTP请求, 具体包括:
1. GET
2. POST
3. PUT
4. DELETE
5. OPTIONS
在bottle框架中,请求对象类为`request`。这个对象包含了HTTP协议中的所有内容,如HTTP方法、URL、头等元数据。 以下是一些内置的请求属性:
- `request.app` – 应用程序实例
- `request.body`- 字符串请求体数据
- `request.get_cookie` - 用于获取Cookie
- `request.headers` - 用于访问HTTP头
- `request.params` - 用于访问所有请求参数(查询字符串和POST正文的交集),并根据参数类型(str、float等)返回解码过的结果。
- `request.query` - 用于访问查询参数
- `request.POST` - 用于访问POST参数
- `request.json` - 用于从JSON请求体提取数据
- `request.files.` - 用于访问传入的文件。
使用如下代码片段来展示一个简单请求的代码:
from bottle import route, run, request
@route('/example')
def example():
return request.query.id
#请求查询(GET)参数 `id`
run(host='localhost', port=8080, debug=True)
## 4. 响应
在Bottle框架中,返回与响应非常基础,路由处理函数仅需要返回一个字符串即可。这个字符串能够被自动发送到客户端并被解析为内容。
Bottle框架支持返回以下内容:
- 字符串
- 字符列表
- 文件
- 字典,自动转换成 JSON
- (生成)器以逐渐提供数据流式传输的每个部分
下面是一个创建一个简单的HTML响应的方法:
from bottle import route, run, request
@route('/')
def main():
return "Welcome Home!
/"
run(host='localhost', port=8080, debug=True)
## 5. 案例应用
### (1)HTML
下面是一个包含评论“框”和评论的HTML文件:
Real-time Commenting
#comments {
margin: 20px;
background-color: #f0f0f0;
padding: 20px;
}
#comments .comment {
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid #ccc;
display: none;
}
#comments .comment p {
margin-top: 0;
}
#comments .comment time {
font-size: 90%;
color: #999;
}
$(function () {
var $comments = $('#comments');
var $alert = $('#alert');
var $home = $alert.find('a');
var last_comment_id = 0;
function get_comments() {
$.getJSON('/api/', {after_id: last_comment_id}, function (comments) {
$.each(comments, function (i, comment) {
if (comment.id > last_comment_id) {
last_comment_id = comment.id;
display_comment(comment);
}
});
setTimeout(get_comments, 1000);
});
}
function display_comment(comment) {
var $comment = $('
').addClass('comment');
$('').text(comment.text).appendTo($comment);
$('
$comment.prependTo($comments).slideDown();
}
$('#add-comment').submit(function () {
$.post('/api/', $(this).serialize(), function (comment) {
display_comment(comment);
$('#reply').val('');
});
return false;
});
$alert.hide();
get_comments();
});
Real-time Commenting
### (2)Python框架
下面是实现实时的评论系统的Python代码,使用框架:
from bottle import Bottle, request, view, template, HTTPError, HTTPResponse
from datetime import datetime, timedelta
import json
app = Bottle()
COMMENTS = []
COMMENT_ID = 0
@app.route('/')
@view('index')
def index():
return {}
@app.route("/api/", method="GET")
def get_comments():
global COMMENTS
global COMMENT_ID
def later_than(comment):
return comment['id'] > int(request.query.after_id or "-1")
comments = filter(later_than, COMMENTS)
return {'comments': comments}
@app.route("/api/", method="POST")
def post_comment():
global COMMENTS
global COMMENT_ID
if request.get_header("content-type") != "application/x-www-form-urlencoded":
status = "Request content must be application/x-www-form-urlencoded"
headers = {'Content-Type': 'text/plain'}
error_response = HTTPResponse(body=status, status=400, headers=headers)
return error_response
text = request.forms.get('text')
if not text:
status = "No text provided"
headers = {'Content-Type': 'text/plain'}
error_response = HTTPResponse(body=status, status=400, headers=headers)
return error_response
COMMENT_ID += 1
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
comment = {'id': COMMENT_ID, 'text': text, 'timestamp': timestamp}
COMMENTS.append(comment)
response = HTTPResponse(body=json.dumps(comment), status=201, headers= {'Content-Type': 'application/json'})
if request.is_ajax:
response.set_header("cache-control", "no-cache")
return response
if __name__ == "__main__":
app.run(debug=True)
### (3)CSS
下面是评论系统的CSS文件:
body {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
h1 {
margin-bottom: 20px;
}
textarea[name="reply"] {
width: 100%;
margin-bottom: 10px;
height: 100px;
}
#add-comment button {
float: right;
}
#comments {
margin: 20px;
background-color: #f0f0f0;
padding: 20px;
}
#comments .comment {
margin-bottom: 10px;
padding-bottom: 10px;
border-bottom: 1px solid #ccc;
display: none;
}
#comments .comment p {
margin-top: 0;
}
#comments .comment time {
font-size: 90%;
color: #999;
}
本案例使用Bottle框架构建了一个能够实时评论的Web应用程序。它演示了如何使用Bottle在Python中构建Web应用程序的各个方面,如路由、请求、响应和HTML模板。 通过Bottle,甚至可以在几分钟内构建出实时评论这样的Web应用程序!
本文介绍了Web框架的使用方法与案例应用,从安装、路由、请求、响应等方面详细讲解了其使用方法。同时,通过实时评论的案例应用,可以看出框架的灵活性和实用性,这都是它成为业界最好、最小和最快的Web框架之一的重要原因。