最近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)
这个例子很简单,但是很有表达力。坐下来好好欣赏下。
我们来解释一下上面的代码吧:
第一行导入了Flask类,以便创建一个Flask应用的实例。
接下来一行我们创建了一个Flask类的实例。这是一个WSGI应用实例。WSGI是“Web服务器网关接口”(Web Service Gateway Interface)的缩写,同时也是架设web项目的Python标准。这一行要告诉Flask到哪里去找应用所需的静态资源和模板。在我们的例子中,我们传递了
name
,让Flask在当前模块内定位资源。接着我们定义了一些关于
/
的路由。第一个路由是为根路径/
准备的,第二个则对应于类似/shekhar
、/abc
之类的路径。对于/
路由,我们将初始的name
设定为Guest
。如果用户访问 http://localhost:5000/ ,那么他会看到Hello Guest
。如果用户访问 http://localhost:5000/shekhar ,那么他会看到Hello shekhar
。最后我们使用
python app.py
命令来启动开发服务器,以运行应用。我们把上面的代码复制到app.py
文件中。我们同时通过Debug=True
开启了调试,这样当意料之外的情况出现时,浏览器就可以提供一个交互式的调试器。开启调试的另一个好处是,改动文件 之后,服务会自动重新加载。我们可以让调试器在后台运行,然后继续在我们的应用上工作。这提供了高效的开发环境。你可以问问Java开发者如何实现自动重新加载 :)
关于Flask值得知道的一些事:
Flask由Armin Ronacher于2010年创建。
Flask的灵感来自Sinatra。(Sinatra是一个极力避免小题大作的创建web应用的Ruby框架。)
Flask依赖于两个库,一个是Werkzeug(Python的WSGI工具库),一个是Jinja2(一个模板引擎)。
Flask遵循“约定优于配置”以及合理的默认值原则。
我为什么要关心Flask?
我决定学习Flask是因为:
易于学习: 我已有8年的Java开发经验。因此学完了Python基础之后我想接触web开发。Flask非常易于使用,同时,正如我上面的示例代码所展示的那样,是一个简单得要死的框架。我大脑很自然地就适应它了,使用Flask,我可以更快地开发。
非常活跃、生机勃勃的社区:我和几个Python的朋友交谈过,每个人都建议我从Flask入手。我也google过,我发现到处都说Flask是最好的现代web开发的Python框架。
快速创建REST API:我希望学习便于创建REST服务的框架。我们上面展示的例子,可以很容易地改成返回json文档的应用,只需使用Flask的
jsonify
函数。未来的web应用将架构在REST后端和基于现代JawaScript MV*框架的前端。280页优质文档,有很多例子。
Flask遵循“约定优于配置”。也有合理的默认值,比如静态资源放置在static文件夹中。当然,大部分默认值是可覆盖的。
关于《Flask 即时Web开发》
现在让我们来看下这本书的一些细节吧。
这书属于菜谱类,每节创建一个示例应用。全书仅78页。
售价 $11。
作者为Flask提交过补丁。
我喜欢这书的哪些方面?
从
virtualenv
起步,这是python开发的正道。避免污染主python环境。方便不同的项目采用不同版本的python。使用最佳实践,比如良好的目录结构之类的。虽然Flask是一个微框架,但是我们仍然应该为应用设定良好的层次。开发企业应用的时候这很有帮助。
介绍了一些我没听说过的Flask功能和扩展。 比如介绍了Flask-Script扩展。Flask-Script支持为Flask应用编写外部的脚本。
详细解释了WTForms。WTForms有助于编写基于表单的应用。
哪些可以更好?
对于初学者而言,一些主题不够清晰,相关知识也讲得不够。我就看不明白为什么要在Flask应用中使用子域名。
缺乏Postgresql和Mysql之类真实数据库的内容。虽然作者提到了使用不同的数据库uri来连接Postgresql和Mysql,但没有给出真实的例子。我更喜欢使用一个真实数据库的例子,而不是把数据库放在内存里。当然,把数据库放在内存里对初学者来说更容易。
没有提到REST服务:对于今时今日的应用而言,REST不可缺少。使用Flask的一大优势就是我们可以利用它很方便地编写REST服务。
没有提到如何配合Flask使用MongoDB之类的NoSQL数据库。
Flask框架的单元测试支持相当完善,但是作者没有介绍。
没有提到云部署。在本文中,我将展示如何把书中提到的示例程序部署到OpenShift上。
我该买这本书么?
那些想编写传统的基于RDBMS的web应用的Flask初学者会发现这本书很有用。
Flask起步
开始使用Flask前我们需要安装Python和virtualenv。本文中使用的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(平台即服务)。
依赖
在构建应用之前,我们需要做些设置:
注册一个OpenShift账号。注册是完全免费的,Red Hat给每个用户三枚免费的Gear,可以用Gear运行你的应用。在写作此文的时候,每个用户能免费使用总共 1.5 GB 内存和 3 GB 硬盘空间。
安装 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使用 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/ 访问。
今天就到这里了,欢迎反馈意见。
Flask —— 使用Python和OpenShift进行即时Web开发的更多相关文章
-
【python】 web开发入门
进入Web开发 现在你完成了Python忍者训练,准备深入Ptyhon的Web开发,但现在的问题是有很多的框架,从中选择最好的框架非常困难,但从初学者的角度出发,Flask基本Web框架将非常适合We ...
-
《Flask Web开发——基于Python的Web应用开发实践》一字一句上机实践(上)
目录 前言 第1章 安装 第2章 程序的基本结构 第3章 模板 第4章 Web表单 第5章 数据库 第6章 电子邮件 第7章 大型程序的结构 前言 学习Python也有一个半月时间了,学到现在感觉 ...
-
通过uwsgi+nginx启动flask的python web程序
通过uwsgi+nginx启动flask的python web程序 一般我们启动python web程序的时候都是通过python直接启动主文件,测试的时候是可以的,当访问量大的时候就会出问题pyth ...
-
python三大web框架Django,Flask,Flask,Python几种主流框架,13个Python web框架比较,2018年Python web五大主流框架
Python几种主流框架 从GitHub中整理出的15个最受欢迎的Python开源框架.这些框架包括事件I/O,OLAP,Web开发,高性能网络通信,测试,爬虫等. Django: Python We ...
-
python web开发c6——阿里云上ubuntu+flask+gunicorn+nginx服务器部署(一)简单测试
简述 Nginx在服务器部署中的作用 请求通过Nginx实现反向代理,将请求提交给代理服务器.本文中只用了一台服务器,所以是代理到本机. gunicorn的作用 作为服务器代码的容器.接收Nginx的 ...
-
学习参考《Flask Web开发:基于Python的Web应用开发实战(第2版)》中文PDF+源代码
在学习python Web开发时,我们会选择使用Django.flask等框架. 在学习flask时,推荐学习看看<Flask Web开发:基于Python的Web应用开发实战(第2版)> ...
-
flask程序部署在openshift上的一些注意事项
https://www.openshift.com/blogs/how-to-install-and-configure-a-python-flask-dev-environment-deploy-t ...
-
Redis的Python实践,以及四中常用应用场景详解——学习董伟明老师的《Python Web开发实践》
首先,简单介绍:Redis是一个基于内存的键值对存储系统,常用作数据库.缓存和消息代理. 支持:字符串,字典,列表,集合,有序集合,位图(bitmaps),地理位置,HyperLogLog等多种数据结 ...
-
Python Web 开发的十个框架【转载】
Python 是一门动态.面向对象语言.其最初就是作为一门面向对象语言设计的,并且在后期又加入了一些更高级的特性.除了语言本身的设计目的之外,Python标准 库也是值得大家称赞的,Python甚至还 ...
随机推荐
-
SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
1.前言 使用框架都是较新的版本: Spring 4.0.2 RELEASE Spring MVC 4.0.2 RELEASE MyBatis 3.2.6 2.Maven引入需要的JAR包 2.1设置 ...
-
JDK动态代理和CGLIB的区别
Aspect默认情况下不用实现接口,但对于目标对象,在默认情况下必须实现接口 如果没有实现接口必须引入CGLIB库 我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动 ...
-
正则表达式分组()、不捕获(?:)和断言(?<;=)详解
分组 分组在正则中用()表示,根据小菜理解,分组的作用有两个: 1.将某些规律看成是一组,然后进行组级别的重复,可以得到意想不到的效果. 2.分组之后,可以通过后向引用简化表达式(\1 或者$1). ...
-
[Java] 利用LinkedHashMap来实现LRU Cache
http://www.acmerblog.com/leetcode-lru-cache-lru-5745.html https://oj.leetcode.com/discuss/1188/java- ...
-
django上传文件
template html(模板文件): <form enctype="multipart/form-data" method="POST" action ...
-
【转】理解依赖注入(IOC)和学习Unity
IOC:英文全称:Inversion of Control,中文名称:控制反转,它还有个名字叫依赖注入(Dependency Injection).作用:将各层的对象以松耦合的方式组织在一起,解耦,各 ...
-
jQuery 扩展 【ajax实例】
先前写工具类都是自定义类,直接prototype,jQuery扩展这一块儿,一直也没写过,刚好今天有空,写个试试. 已经有很多人对jQuery,jQuery.fn,jQuery.fn.extend详细 ...
-
(转载)delphi checklistbox用法
delphi checklistbox用法 在Delphi中checklistbox中高亮选中(不论是否Checked)能够进行操作么?删除,上下移动等等 删除:CheckListBox.Delete ...
-
Linux内核分析 期末总结
Linux内核分析 期末总结 一.知识概要 1. 计算机是如何工作的 存储程序计算机工作模型:冯诺依曼体系结构 X86汇编基础 会变一个简单的C程序分析其汇编指令执行过程 2. 操作系统是如何工作的 ...
-
浮动和margin-left负值的有趣现象
我将第二个浮动的元素的margin-left的值不断减小: 被设置元素左移,后面的元素跟着动 当被设置元素的右边界超过了前面元素的左边界,后面边的元素被前面的元素挡在外面了