Python轻量级web框架bottle使用方法解析

是Python语言下一款轻量级的Web框架,它的强项是小型应用和API的开发。它的目标是让Web开发更简单,更快捷。Bottle使用灵活简单的代码结构来满足不同项目需求,使其成为业界最好、最小和最快的Web框架之一。本文将深入探讨框架的使用方法与案例应用。

## 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. 案例应用

是一个轻量级的PythonWeb框架,可以为日常开发。下面将介绍一个使用实现的实时评论功能的Demo应用。

### (1)HTML

下面是一个包含评论“框”和评论的HTML文件:

Real-time Commenting

Real-time Commenting

Your comment was submitted

Return home

### (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框架之一的重要原因。

后端开发标签