返回介绍

Day 3: Flask - 使用 Python 和 OpenShift 进行即时 Web 开发

发布于 2025-01-31 20:47:29 字数 7145 浏览 0 评论 0 收藏 0

-

最近 Packtpub 找到了我,让我给他们新出版的关于 Flask 的书写书评。Flask 是一个很流行的 Python 框架。那本书是 Ron DuPlain 写的 《Flask 即时 Web 开发》 。我决定把 “30 天学习 30 种新技术” 挑战的第三天花在 Flask 上。在本文中,我首先将介绍 Flask 框架的一些基本知识,然后提供一个短篇的书评。同样,我也会把示例应用移植到 OpenShift 上。对于 Flask 而言我不是一个完全意义上的新手,我也用它创建过示例应用。对我来说,这是一次很好的温习。

给不了解这一系列文章的读者:我正在尝试 “30 天学习 30 种新技术” 的挑战。每天我会学习一种新技术,然后写一篇文章介绍下我学到了什么,我怎样使用新学的工具。如果一天不够一项技术,我会每天讨论一个关于该项技术的子话题。

Flask 是什么?

有些开发者可能没听说过 Flask,我来简单介绍一下吧。Flask 是一个基于 Python 的微型的 web 开发框架。虽然 Flask 是微框架,不过我们并不需要像别的微框架建议的那样把所有代码都写到单文件中。毕竟微框架真正的含义是简单和短小。我们可以从单文件架构开始工作,只用需要的特性。等我们渐渐熟悉 Flask 之后,可以将代码提取成模块,同时学习 Flask 提供的高级功能。Flask 没有给出关于文件架构的建议,但是在这篇文章的后面我会讨论书中建议的文件架构。

让我们看一段示例代码吧:

from flask import Flask
app = Flask(__name__)

@app.route('/', defaults={'name':"Guest"})
@app.route('/<string:name>' , methods=['GET'])
def say_hello(name):
  return "Hello " + name

if __name__ == "__main__":
  app.run(debug=True)

这个例子很简单,但是很有表达力。坐下来好好欣赏下。

我们来解释一下上面的代码吧:

  1. 第一行导入了 Flask 类,以便创建一个 Flask 应用的实例。
  2. 接下来一行我们创建了一个 Flask 类的实例。这是一个 WSGI 应用实例。WSGI 是“Web 服务器网关接口”(Web Service Gateway Interface)的缩写,同时也是架设 web 项目的 Python 标准。这一行要告诉 Flask 到哪里去找应用所需的静态资源和模板。在我们的例子中,我们传递了 name ,让 Flask 在当前模块内定位资源。
  3. 接着我们定义了一些关于 / 的路由。第一个路由是为根路径 / 准备的,第二个则对应于类似 /shekhar/abc 之类的路径。对于 / 路由,我们将初始的 name 设定为 Guest 。如果用户访问 http://localhost:5000/ ,那么他会看到 Hello Guest 。如果用户访问 http://localhost:5000/shekhar ,那么他会看到 Hello shekhar
  4. 最后我们使用 python app.py 命令来启动开发服务器,以运行应用。我们把上面的代码复制到 app.py 文件中。我们同时通过 Debug=True 开启了调试,这样当意料之外的情况出现时,浏览器就可以提供一个交互式的调试器。开启调试的另一个好处是,改动文件 之后,服务会自动重新加载。我们可以让调试器在后台运行,然后继续在我们的应用上工作。这提供了高效的开发环境。你可以问问 Java 开发者如何实现自动重新加载 :)

关于 Flask 值得知道的一些事:

  1. Flask 由 Armin Ronacher 于 2010 年创建。
  2. Flask 的灵感来自 Sinatra。(Sinatra 是一个极力避免小题大作的创建 web 应用的 Ruby 框架。)
  3. Flask 依赖于两个库,一个是 Werkzeug(Python 的 WSGI 工具库),一个是 Jinja2(一个模板引擎)。
  4. Flask 遵循“约定优于配置”以及合理的默认值原则。

我为什么要关心 Flask?

我决定学习 Flask 是因为:

  1. 易于学习: 我已有 8 年的 Java 开发经验。因此学完了 Python 基础之后我想接触 web 开发。Flask 非常易于使用,同时,正如我上面的示例代码所展示的那样,是一个简单得要死的框架。我大脑很自然地就适应它了,使用 Flask,我可以更快地开发。
  2. 非常活跃、生机勃勃的社区:我和几个 Python 的朋友交谈过,每个人都建议我从 Flask 入手。我也 google 过,我发现到处都说 Flask 是最好的现代 web 开发的 Python 框架。
  3. 快速创建 REST API:我希望学习便于创建 REST 服务的框架。我们上面展示的例子,可以很容易地改成返回 json 文档的应用,只需使用 Flask 的 jsonify 函数。未来的 web 应用将架构在 REST 后端和基于现代 JawaScript MV*框架的前端。
  4. 280 页优质文档,有很多例子。
  5. Flask 遵循“约定优于配置”。也有合理的默认值,比如静态资源放置在 static 文件夹中。当然,大部分默认值是可覆盖的。

关于《Flask 即时 Web 开发》

现在让我们来看下这本书的一些细节吧。

  1. 这书属于菜谱类,每节创建一个示例应用。全书仅 78 页。
  2. 售价 $11。
  3. 作者为 Flask 提交过补丁。

我喜欢这书的哪些方面?

  1. virtualenv 起步,这是 python 开发的正道。避免污染主 python 环境。方便不同的项目采用不同版本的 python。
  2. 使用最佳实践,比如良好的目录结构之类的。虽然 Flask 是一个微框架,但是我们仍然应该为应用设定良好的层次。开发企业应用的时候这很有帮助。
  3. 介绍了一些我没听说过的 Flask 功能和扩展。 比如介绍了 Flask-Script 扩展。Flask-Script 支持为 Flask 应用编写外部的脚本。
  4. 详细解释了 WTForms。WTForms 有助于编写基于表单的应用。

哪些可以更好?

  1. 对于初学者而言,一些主题不够清晰,相关知识也讲得不够。我就看不明白为什么要在 Flask 应用中使用子域名。
  2. 缺乏 Postgresql 和 Mysql 之类真实数据库的内容。虽然作者提到了使用不同的数据库 uri 来连接 Postgresql 和 Mysql,但没有给出真实的例子。我更喜欢使用一个真实数据库的例子,而不是把数据库放在内存里。当然,把数据库放在内存里对初学者来说更容易。
  3. 没有提到 REST 服务:对于今时今日的应用而言,REST 不可缺少。使用 Flask 的一大优势就是我们可以利用它很方便地编写 REST 服务。
  4. 没有提到如何配合 Flask 使用 MongoDB 之类的 NoSQL 数据库。
  5. Flask 框架的单元测试支持相当完善,但是作者没有介绍。
  6. 没有提到云部署。在本文中,我将展示如何把书中提到的示例程序部署到 OpenShift 上。

我该买这本书么?

那些想编写传统的基于 RDBMS 的 web 应用的 Flask 初学者会发现这本书很有用。

Flask 起步

开始使用 Flask 前我们需要安装 Pythonvirtualenv 。本文中使用的 Python 版本是 2.7。

安装 flask:

$ mkdir schedulingapp
$ cd schedulingapp/
$ virtualenv venv --python=python2.7
$ . venv/bin/activate
$ pip install flask

在上面的命令中,我们首先创建了一个为示例应用准备的目录,然后激活了 virtualenv。virtualenv 有助于避免污染 python 主环境。这意味着不同的项目可以使用不同的 python 版本。最后,我们安装了 flask。 pip install flask 会安装最新的 flask 框架稳定版。

部署示例应用到 OpenShift

书中的示例程序是一个简单的预约应用。注册账户后,可以登录应用创建、修改、查看预约。使用如下命令可以在本地运行应用:

$ git clone https://github.com/shekhargulati/instant-flask-web-development-book-app.git scheduleapp
$ cd scheduleapp
$ virtualenv venv --python=python2.7
$ . venv/bin/activate
$ pip install -r requirements.txt
$ python manage.py create_tables
$ python manage.py runserver

然后就可以在 http://127.0.0.1:5000 访问应用了。用户可以注册账号,开始使用应用了。

很不错。但是我打算把我的应用部署到云端。我们将在 OpenShift 上部署应用。OpenShift 是一个开源、公开、可伸缩的 PaaS(平台即服务)。

依赖

在构建应用之前,我们需要做些设置:

  1. 注册一个 OpenShift 账号 。注册是完全免费的,Red Hat 给每个用户三枚免费的 Gear,可以用 Gear 运行你的应用。在写作此文的时候,每个用户能免费使用总共 1.5 GB 内存和 3 GB 硬盘空间。
  2. 安装 rhc 客户端工具rhc 是 ruby gem,因此你的机子上需要装有 ruby 1.8.7 以上版本。 只需输入 sudo gem install rhc 即可安装 rhc 。如果你已经安装过了,确保是最新版。运行 sudo gem update rhc 即可升级。关于配置 rhc 命令行工具的详细信息,请参考: https://openshift.redhat.com/community/developers/rhc-client-tools-install
  3. 使用 rhc 的 setup 命令配置你的 OpenShift 账号。这个命令会帮助你创建一个命名空间,同时将你的 ssh 公钥上传至 OpenShift 服务器。

部署应用

输入如下命令即可将应用部署到 OpenShift:

rhc create-app schedapp python-2.7 postgresql-9.2 --from-code=https://github.com/shekhargulati/schedapp-openshift.git

这个命令将创建应用,设置公开的 DNS,创建私有 git 仓库,最后利用你的 Github 仓库中的代码来部署应用。应用可以通过 http://schedapp-shekhargulati.rhcloud.com/ 访问。

今天就到这里了,欢迎反馈意见。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文