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

介绍

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

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

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

准备

在开始本教程之前,您需要以下内容:

  • CentOS 7 CVM,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 了解如何从命令行编辑文本文件的工作知识。
  • 一个可以使用sudo命令的非root账号。

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

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

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

更新您的包裹清单:

sudo yum update

从存储库安装python-virtualenv

sudo yum install python-virtualenv

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

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

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

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

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

source venv/bin/activate

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

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

cd ~/projects
source venv/bin/activate

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

deactivate

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

第三步 - 安装Bottle

pip是virtualenv程序安装的工具之一。

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

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

pip search bottle

我们将从安装Bottle包开始:

pip install bottle

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

第四步 - 创建您的第一个Bottle应用程序

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

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

Bottle应用程序非常简单。在最简单的形式中,它可以在单个文件中实现所有这些组件。我们将创建一个“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

第五步 - 创建Bottle模型

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

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

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

SQLite包含在CentOS 7默认映像中,但如果您需要重新安装它,一个命令就可以轻松安装它:

sudo yum 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命令确认是否已创建数据库文件。

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

第六步 - 创建Bottle控制器

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

创建一个存储我们的主应用程序的名为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

第七步 - 创建Bottle视图

现在我们有了模型和控制器,唯一剩下要创建的是我们的视图。使用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中的变量。

保存并关闭文件。

第八步 - 启动Bottle应用程序

我们的申请现已完成。

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

python ~/projects/picnic.py

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

  • http://your_server_ip:8080/picnic

您的网页应如下所示:

CTRL-C停止应用程序。

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

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

~/projects/

例如:

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

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

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

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

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’

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

结论

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

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

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

想要了解更多关于Linux的开源信息教程,请前往腾讯云+社区学习更多知识。

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

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

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

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Danny的专栏

【事务隔离级别】——深度探索数据库的事务隔离级别

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

942
来自专栏Pythonista

Django之常用命令以及问题汇总

django-admin.py startproject project-name

1751
来自专栏乐沙弥的世界

Oracle实例和Oracle数据库(Oracle体系结构)

--==========================================

1332
来自专栏aoho求索

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

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

901
来自专栏代码世界

MYSQL之库操作

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

3587
来自专栏PHP在线

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

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

1574
来自专栏禅林阆苑

mysql学习总结01 — 配置运行

修改 /etc/mysql/my.cnf 文件中 bind-address,将 bind-address=127.0.0.1 修改为本机IP,重启mysql服务

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

数据库最大连接数量

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

1152
来自专栏pangguoming

centos6.8 mysql5.6.34 root密码重置

1485
来自专栏张戈的专栏

zabbix agentd客户端插件Shell一键自动安装脚本

这次生产环境上线了多台 Linux 服务器,需要全部纳入 Zabbix 监控范畴,一台一台的去装 Zabbix Agentd 插件那就太苦逼了,所幸 Zabbi...

3445

扫码关注云+社区

领取腾讯云代金券