# 如何在Ubuntu 14.04上使用Bottle Micro Framework部署Python Web应用程序 ##

介绍

由于其灵活性和高级功能,Python是一种优秀的Web编程语言。Web框架可以使编程Web应用程序更加简单,因为它们连接了强大的Web界面所需的许多组件。

虽然一些网络框架试图提供一切,但其他人试图在处理重要的,难以实施的问题时避开障碍。Bottle是一个Python框架,属于第二类。它非常轻巧,但也可以快速开发应用程序。

在本指南中,我们将介绍如何设置和使用Bottle在Ubuntu 14.04服务器上创建简单的Web应用程序。

准备

在开始本指南之前,您需要以下内容:

  • 一个Ubuntu 14.04 腾讯云CVM
  • 了解如何从命令行编辑文本文件的工作知识
  • 一个有sudo权限的用户(你需要一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器。)

第1步 - 为Python安装虚拟环境

Python是用于构建Bottle的编程语言,默认情况下安装在Ubuntu上。

我们将安装python-virtualenv包以将我们的Python项目与系统的Python环境隔离开来。virtualenv软件允许我们为Python项目创建一个独立的,包含的环境,不会影响整个操作系统。

更新您的包裹清单:

sudo apt-get update

从存储库安装python-virtualenv

sudo apt-get install python-virtualenv

我们将在主目录中创建一个projects文件夹,然后在此文件夹中创建一个虚拟环境:

mkdir ~/projects
cd ~/projects
virtualenv --no-site-packages venv

这将创建一个在目录中调用venvprojects目录。它在此文件夹中安装了一些Python实用程序,并创建了一个目录结构来安装其他工具。

第2步 - 激活Python的虚拟环境

在开始处理我们的项目之前,我们必须激活虚拟环境:

source venv/bin/activate

命令提示符将更改以反映我们现在在虚拟环境中运行的事实。

如果以后需要重新连接,请确保使用以下命令再次激活环境:

cd ~/projects
source venv/bin/activate

如果需要退出虚拟环境,可以随时键入:

deactivate

此时不要停用您的虚拟环境。

第3步 - 安装瓶子

virtualenv程序安装的工具之一pip

这个工具允许我们从Python包索引(一个在线存储库)轻松安装Python包。

如果我们想要搜索与Bottle有关的Python包,我们可以运行:

pip search bottle

我们将从安装Bottle包开始:

pip install bottle

在该过程完成后,我们应该能够在我们的应用程序中使用Bottle框架。

第4步 - 创建您的第一瓶应用程序

与大多数框架一样,Bottle实现了MVC软件模式的一个版本。MVC代表模型,视图和控制器,它描述了分离用户界面的不同功能的决定。

模型是一组数据的表示,负责存储,查询和更新数据。该视图描述了如何向用户呈现信息。它用于格式化和控制数据的表示。该控制器是应用程序,它决定如何响应用户的请求的主处理中心。

瓶子应用程序非常简单。在最简单的形式中,他们可以在单个文件中实现所有这些组件。我们将创建一个“hello world”应用程序来展示如何完成。

用你喜欢的文本编辑器,创建一个名为hello.py的Python应用程序:

nano ~/projects/hello.py

我们将每次向您显示每一行,并在本节末尾包含最终文件。

在这个文件中,我们将添加的第一行从Bottle包中导入一些功能。这将允许我们在我们的应用程序中使用框架工具:

from bottle import route, run

这一行告诉我们的程序我们要导入路径并从Bottle包中运行模块。

  • run我们导入的模块可用于在开发服务器上运行应用程序,这对于快速查看程序结果非常有用
  • route我们导入的模块负责告诉应用程序由哪些Python函数处理哪些URL请求。Bottle应用程序通过为每个请求的URL调用单个Python函数来实现路由。然后它将函数的结果返回给用户

我们现在可以添加一个与URL模式/hello匹配的路由。在文件底部添加一个新行:

from bottle import route, run
​
@route('/hello')

此路径装饰器匹配URL /hello,因此在服务器上请求该路径时,将执行直接跟随的功能。在文件末尾再添加两行:

from bottle import route, run
​
@route('/hello')
def hello():
    return "<h1>Hello World!</h1>"

此函数非常简单,但它完成了路由功能的唯一要求:它返回一个可以在Web浏览器中显示的值。在这种情况下,该值是一个简单的HTML字符串。我们可以删除h1标头标签,相同的信息将以未修饰的方式显示。

最后,我们需要使用开发服务器运行我们的应用程序。添加最后一行,现在您的文件已完成:

from bottle import route, run
​
@route('/hello')
def hello():
    return "<h1>Hello World!</h1>"
​
run(host='0.0.0.0', port=8080)

该行将运行服务器实例。

  • 通过传递参数host='0.0.0.0',这将把内容提供给任何计算机,而不仅仅是本地计算机。这很重要,因为我们的应用程序是远程托管的
  • port参数指定将使用的端口

保存并关闭文件。

我们可以使用以下命令运行此应用程序:

python ~/projects/hello.py

您可以在Web浏览器中访问此应用程序,方法是转到您的IP地址,然后是我们选择运行的端口(8080),然后是我们创建的路径(/ hello):

  • http://your_server_ip:8080/hello

它看起来像这样:

您可以通过键入以下命令随时停止服务器:

CTRL-C

第5步 - 创建瓶子模型

我们现在已经实施了第一个应用程序 这很简单,但它并没有真正实现MVC原则,或做任何特别有趣的事情。让我们这次创建一个稍微复杂的应用程序。

我们将从我们的模型开始。这是我们程序中处理数据存储的部分。通过使用插件,Bottle可以轻松实现各种数据后端。

我们将为我们的数据库使用SQLite数据库文件。这是一个非常简单的数据库,专为轻量级任务而设

使用以下命令安装SQLite:

sudo apt-get install sqlite

我们还需要下载并安装允许我们使用这些数据库的Bottle插件:

pip install bottle-sqlite

现在我们有了组件,我们将创建一个Python文件,该文件将生成带有一些数据的SQLite数据库。我们可以在Python解释器中执行此操作,但创建文件可以轻松重复。

创建文件:

nano ~/projects/picnic_data.py

将此内容添加到文件中。它将创建一个充满野餐库存物品的数据库:

import sqlite3
db = sqlite3.connect('picnic.db')
db.execute("CREATE TABLE picnic (id INTEGER PRIMARY KEY, item CHAR(100) NOT NULL, quant INTEGER NOT NULL)")
db.execute("INSERT INTO picnic (item,quant) VALUES ('bread', 4)")
db.execute("INSERT INTO picnic (item,quant) VALUES ('cheese', 2)")
db.execute("INSERT INTO picnic (item,quant) VALUES ('grapes', 30)")
db.execute("INSERT INTO picnic (item,quant) VALUES ('cake', 1)")
db.execute("INSERT INTO picnic (item,quant) VALUES ('soda', 4)")
db.commit()

在这个文件中,我们:

  • 导入SQLite包
  • 执行创建表并插入数据的命令
  • 最后,我们提交更改

保存并关闭文件。

执行该文件,该文件将创建picnic.db在当前目录中调用的数据库文件:

python ~/projects/picnic_data.py

如果您愿意,可以用ls在目录中确认是否已创建数据库文件。

我们程序的模型部分现在相当完整。我们可以看到,我们的模型将稍微说明我们的控制部分必须如何与我们的数据交互。

6 - 创建瓶控制器

现在我们有了一个数据库,我们可以开始开发我们的主应用程序了。这将主要实现我们的控制器功能。它也将是与我们的第一个应用程序最相似的文件。

创建一个名为picnic.py存储我们的主应用程序的文件:

nano ~/projects/picnic.py

和以前一样,我们将逐行解释文件,并在步骤结束时显示已完成的文件。

在这个文件中,我们需要从Bottle包中导入一些东西,就像之前一样。我们需要一些以前没有使用的附加模块。另外,我们需要导入SQLite功能:

import sqlite3
from bottle import route, run, template

接下来,我们将定义与URL路径匹配的路由/picnic

import sqlite3
from bottle import route, run, template
​
@route('/picnic')

我们将实现连接到我们的数据库的函数,从表中获取我们的数据,并调用我们的视图来呈现页面。

import sqlite3
from bottle import route, run, template
​
@route('/picnic')
def show_picnic():
    db = sqlite3.connect('picnic.db')
    c = db.cursor()
    c.execute("SELECT item,quant FROM picnic")
    data = c.fetchall()
    c.close()
    output = template('bring_to_picnic', rows=data)
    return output
  • 连接到数据库的命令是db = sqlite3.connect('picnic.db')命令
  • 我们查询数据库,并使用接下来的四行选择所有值
  • 我们称视图格式化数据的行是output = template('bring_to_picnic', rows=data)。这会调用一个模板(视图)来调用bring_to_picnic.tpl数据格式。它将data变量作为rows模板变量传递
  • 最后,它将格式化的输出返回给我们的用户

最后,我们需要添加run命令来运行实际的服务器:

import sqlite3
from bottle import route, run, template
​
@route('/picnic')
def show_picnic():
    db = sqlite3.connect('picnic.db')
    c = db.cursor()
    c.execute("SELECT item,quant FROM picnic")
    data = c.fetchall()
    c.close()
    output = template('bring_to_picnic', rows=data)
    return output
​
run(host='0.0.0.0', port=8080)

保存并关闭文件。

我们将在下一节中创建此bring_to_picnic.tpl模板文件。

第7步 - 创建瓶子视图

现在我们有了模型和控制器,唯一剩下要创建的是我们的视图。使用Bottle的内置模板引擎可以轻松处理。

应用程序将搜索与模板函数中给出的名称匹配的模板,以.tpl。结尾。它可以位于项目的主目录中,也可以位于名为的目录中view

使用上一个脚本中的output行中的模板函数创建一个与我们调用的文件匹配的文件:

nano ~/projects/bring_to_picnic.tpl

在这个文件中,我们可以混合使用HTML和编程。我们会很简单。它将使用循环来创建一个表,我们将使用我们的模型数据填充该表。将所有这些行添加到文件中:

<h1>Things to bring to our picnic</h1>
​
<table>
    <tbody>
        <tr><th>Item</th><th>Quantity</th></tr>
        %for row in rows:
        <tr>
        %for col in row:
            <td>{{col}}</td>
        %end
        </tr>
    %end
    <tbody>
</table>

这将以HTML格式呈现我们的页面。

  • 我们在这里看到的模板语言基本上是Python
  • 在设计输出时,我们可以使用传递给模板的rows变量
  • 我们可以通过前面加%的方式键入Python行
  • 我们可以使用{{var}}语法访问HTML中的变量。

保存并关闭文件。

第8步 - 启动瓶子应用程序

我们的申请现已完成。

我们可以通过在主文件上调用Python来启动程序:

python ~/projects/picnic.py

我们可以通过访问我们的IP地址和端口,然后是我们创建的URL路由来查看结果:

  • http://your_server_ip:8080/picnic

您的网页应如下所示:

CTRL-C停止应用程序。(CTRL-Z是一个更强的停止信号。)

(可选)步骤9 - 上传您自己的应用程序

要上传您自己的Bottle应用程序,您需要将所有项目文件复制到此目录:

~/projects/

例如:

scp myproject.py sammy@your_server_ip:~/projects/

以类似的方式上传与此项目关联的所有文件。如果您不熟悉scp,SFTP是一种上传文件的不同方式。

(可选)步骤10 - 启动您自己的应用程序

激活您的虚拟环境(如果您还没有这样做)。

cd ~/projects/
source venv/bin/activate

我们将使用该python命令启动应用程序。我们将通过在后台启动该过程使其稍微不那么简陋,这意味着您可以关闭终端并且应用程序将继续运行:

nohup python ~/projects/myproject.py &

在输出中,您应该看到您的进程ID号和以下消息:

[1] 20301
(venv)[sammy@bottle projects]$ nohup: ignoring input and appending output to ‘nohup.out’

一旦您准备好投入生产,我们强烈建议您为应用程序制定更强大的启动计划。(只是在后台启动它意味着你的应用程序将在服务器重启后停止。)

结论

到目前为止,您应该能够看到如何使用像Bottle这样的简单,简单的微框架来构建复杂的应用程序。虽然我们的示例很简单,但很容易利用更高级的功能。

Bottle的插件系统也是一项重要的资产。插件在社区中被主动共享,并且通过插件系统很容易实现更复杂的行为。

例如,找到与Bottle兼容的插件的一种简单方法是使用该pip search bottle命令。这将让您了解一些更受欢迎的选项。

更多Ubuntu教程请前往腾讯云+社区学习更多知识。

参考文献:《How To Deploy Python Web Applications with the Bottle Micro Framework on Ubuntu 14.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Laoqi's Linux运维专列

MySQL调优

4469
来自专栏云计算教程系列

如何在Ubuntu 14.04上使用memcached将NoSQL查询添加到MySQL

在许多优秀的文章中已经描述了使用memcached及其独立服务器实现与MySQL的一般概念,但是,作为独立服务器的memcached在MySQL客户端访问层之前...

982
来自专栏云计算教程系列

如何使用CentOS 7上的Bottle Micro Framework部署Python Web应用程序

由于其灵活性和高级功能,Python是一种优秀的Web编程语言。Web框架可以使编程Web应用程序更加简单,因为它们连接了强大的Web界面所需的许多组件。

2733
来自专栏我和PYTHON有个约会

数据库最大连接数量

在数据库操作过程中,经常会遇到一些非业务逻辑错误,这样的错误要求开发人员对于自己正在操作的硬件软件乃至网络都有一定的了解,这里说说关于数据库最大连接数量的那点事...

1102
来自专栏数据和云

Oracle公共云中的MySQL InnoDB集群

题记:本文我们将引导大家完成在Oracle公共云(OPC)中创建3节点InnoDB集群的整个过程,包括从OPC IaaS资源的初始配置,到InnoDB集群的创建...

3325
来自专栏代码世界

MYSQL之库操作

一、系统数据库 information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息、列信息、权限信息、字符信息等 my...

3547
来自专栏JAVA同学会

MongoDB之分片集群(Sharding)

  分片(sharding)是一个通过多台机器分配数据的方法。MongoDB使用分片支持大数据集和高吞吐量的操作。大数据集和高吞吐量的数据库系统挑战着单一服务的...

2882
来自专栏PHP在线

MySQL · 引擎特性 · MySQL内核对读写分离的支持

读写分离的场景应用 随着业务增长,数据越来越大,用户对数据的读取需求也随之越来越多,比如各种AP操作,都需要把数据从数据库中读取出来,用户可以通过开通多个只读实...

1504
来自专栏Linux运维学习之路

MySQL日志管理

MySQL日志管理 错误日志 配置方法: vim /etc/my.cnf [mysqld] log-error=/tmp/mysql.log 查看配置方式: s...

45012
来自专栏aoho求索

基于可靠消息方案的分布式事务(三):Lottor使用

前面两篇文章介绍了笔者关于可靠消息方案的分布式事务的实现思路以及Java中的事务概念,奈何工作抽不出时间,如今时隔已久,分布式事务系列拖了很久,一直没能好好把项...

861

扫码关注云+社区

领取腾讯云代金券