部署应用和最普通的flask app.run 参数() 有什么区别

使用Python的Flask框架来搭建第一个Web应用程序
转载 & & 作者:ipython
Flask框架是一个以轻量级著称的Web开发框架,近两年来在Web领域获得了极高的人气,这里我们就来看如何使用Python的Flask框架来搭建第一个Web应用程序
在这章,你将学到Flask应用程序的不同部分。同时,你将编写和运行你的第一个Flask web应用程序。
所有的Flask应用程序都必须创建一个 应用程序实例 。使用web服务器网关接口协议将所有从客户端接收的请求传递给这个对象处理。这个应用程序实例就是Flask类的一个对象,通常使用下面的方式创建:
from flask import Flask
app = Flask(__name__)
Flask类构造函数唯一需要的参数就是应用程序的主模块或包。对于大多数应用程序,Python的__name__变量就是那个正确的、你需要传递的值。
注:对于Flask开发者来说,传给Flask应用程序构造函数的name参数是比较容易弄混淆的。Flask使用这个参数来确定应用程序的根目录,这样以后可以相对这个路径来找到资源文件。
稍后你可以看到更复杂的应用程序实例初始化,但是对于简单应用程序这些已经足够了。
2、路由和视图函数
客户端例如web浏览器发送 请求 给web服务,进而将它们发送给Flask应用程序实例。应用程序实例需要知道对于各个URL请求需要运行哪些代码,所以它给Python函数建立了一个URLs映射。这些在URL和函数之间建立联系的操作被称之为 路由 。
在Flask应程序中定义路由的最便捷的方式是通过显示定义在应用程序实例之上的app.route装饰器,注册被装饰的函数来作为一个路由。下面的例子会演示怎样使用装饰器来申明一个路由:
@app.route('/')
def index():
return '&h1&Hello World!&/h1&'
注:装饰器是Python语言的标准特性;它们可以以不同方式改变函数的行为。一个常见的模式是使用装饰器来注册函数作为一个事件处理程序。
在上一个示例给应用程序的根URL注册index()函数作为事件的处理程序。如果这个应用程序被部署在服务器上并绑定了 www.example.com 域名,然后在你的浏览器地址栏中输入 http://www.example.com 将触发index()来运行服务。客户端接收到的这个函数的返回值被称为 响应 。如果客户端是web浏览器,响应则是显示给用户的文档。
类似于index()的函数被称作 视图函数 。通过视图返回的响应可以是简单的HTML内容的字符串,但它也可以市更复杂的形式,正如您将看到的。
注:响应字符串嵌入在Python代码中导致代码难以掌控,在此只是介绍响应的概念。你将在第三章学习正确的方法来生成响应。
如果你注意到你每天使用的一些网站URLs如何形成的,你将会发现很多都有变量。例如,你的Facebook个人信息页的URL是 http://www.facebook.com/&username& ,所以你的用户名是它的一部分。Flask在路由装饰器中使用特殊的语法支持这些类型的URLs。下面的示例定义了一个拥有动态名称组件的路由:
@app.route('/user/&name&')
def user(name):
return '&h1&Hello, %s!&/h1&' % name
用尖括号括起来的部分是动态的部分,所以任何URLs匹配到静态部分都将映射到这个路由。当视图函数被调用,Flask发送动态组件作为一个参数。在前面的示例的视图函数中,这个参数是用于生成一个个性的问候作为响应。
在路由中动态组件默认为字符串,但是可以定义为其他类型。例如,路由/user/&int:id&只匹配有一个整数在id动态段的URLs。Flask路由支持int、float和path。path同样是字符串类型,但并不认为斜杠是分隔符,而认为它们是动态组件的一部分。
3、服务启动
应用程序实例有一个run方法用于启动Flask集成的web服务:
if __name__ == '__main__':
app.run(debug=True)
__name__ == '__main__'在此处使用是用于确保web服务已经启动当脚本被立即执行。当脚本被另一个脚本导入,它被看做父脚本将启动不同的服务,所以app.run()调用会被跳过。
一旦服务启动,它将进入循环等待请求并为之服务。这个循环持续到应用程序停止,例如通过按下Ctrl-C。
有几个选项参数可以给app.run()配置web服务的操作模式。在开发期间,可以很方便的开启debug模式,将激活 debugger 和 reloader 。这样做是通过传递debug为True来实现的。
注:Flask提供的web服务并不用于生产环境。你将在十七章学习生产环境的web服务。
4、一个完整的应用程序
在上一节,你学习了Flask web应用程序的不同部分,现在是时候写一个了。整个 hello.py 应用程序脚本只不过将前面描述的三个部分结合在一个文件中。应用程序示例2-1所示。
示例 hello.py:一个完整的Flask应用程序
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
&h1&Hello World!&/h1&
if __name__ == '__main__':
app.run(debug=True)
建议:如果你有克隆在GitHub上的应用程序,你现在可以运行git checkout 2a来切换到这个版本的应用程序。
运行应用程序之前,请确保你在之前创建的虚拟环境已经是激活状态且已安装Flask。现在打开你的web浏览器并在地址栏输入 http://127.0.0.1:5000/ 。下图显示连接到应用程序后的web浏览器。
然后输入以下命令启动应用程序:
(venv) $ python hello.py
* Running on http://127.0.0.1:5000/
* Restarting with reloader
如果你输入任何其他URL,应用程序将不知道如何操作它并且将返回错误代码404给浏览器——当你访问一个不存在的网页也会得到该错误。
下面所示应用程序的增强版添加了第二个动态路由。当你访问这个URI,你应该可以看到一个个性的问候。
示例hello.py:带有动态路由的Flask应用程序
from flask import Flask
app = Flask(__name__)
@app.route('/')
def index():
&h1&Hello World!&/h1&
@app.route('/user/&name&')
def user(name):
&h1&Hello, %s!&/h1&
if __name__ == '__main__':
app.run(debug=True)
建议:如果你有克隆在GitHub上的应用程序,你现在可以运行git checkout 2b来切换到这个版本的应用程序。
测试动态路由,确保服务正在运行随后访问 http://localhost:5000/user/Dave 。生成的应用程序会使用动态参数名响应一个定制的问候。尝试不同的名称,看看视图函数总是生成响应基于给定的名称。
5、请求-响应循环
现在你已经玩过一个基本的Flask应用程序,你也许想要知道更多关于Flask如何施展魔力。下面章节描述了一些框架设计方面的特点。
5.1、应用程序Context和请求Context
当Flask从客户端收到一个请求,它需要提供几个可用对象给视图函数处理。request对象是个不错的例子,它封装了客户端发送的HTTP请求。
Flask视图函数访问request对象的最好方式,就是作为一个参数发送它,但这需要每个单一视图函数在应用程序中有一个额外的参数。考虑一下,如果request对象不是唯一一个视图函数需要访问完成请求的对象,事情将会变得更加复杂。
为了避免弄乱视图函数那些可能需要或不需要的参数,Flask使用context来临时确定可访问的全局对象。也多亏了context,视图函数可以写成下面这样:
from flask import request
@app.route('/')
def index():
user_agent = request.headers.get('User-Agent')
&p&Your browser is %s&/p&
' % user_agent
注意,在这个视图函数中,request是如何被作为一个全局变量来使用的。现实中,request是不能作为全局变量的,如果是多线程服务器,同一时间线程作用于不同客户端的不同请求,所以每一个线程需要看到request中的不同对象。contexts使得Flask确定可访问的全局变量而不干扰其他线程。
注:线程是可以独立管理的最小指令序列。一个进程中有多个活动的线程是非常常见的,有时分享内存或文件句柄资源。多线程web服务器会启动一个线程池并从池中选择一个线程来处理每个传入的请求。
Flask有两类context:应用级context 和 请求级context。表2-1展示了这些context提供的变量。
Flask激活(或压栈)应用级context和请求级context在调度请求之前,然后删除他们当请求被处理后。当应用程序context被压入栈,线程中current_app和g变量变得可用;同样的,当请求级context被压入栈,request和session变量也同样变得可用。如果这些变量中的任何一个不是由激活的应用级或请求级context访问,会产生错误。在后面的章节会详细讨论四个context变量,所以不要担心你不理解它们的用处。
下面的Python shell会话演示了应用级context是如何工作的:
&&& from hello import app
&&& from flask import current_app
&&& current_app.name
Traceback (most recent call last):
RuntimeError: working outside of the application context
&&& app_ctx = app.app_context()
&&& app_ctx.push()
&&& current_app.name
&&& app_ctx.pop()
在这个示例中,当应用级context没有激活,但是却作为有效的context被压入栈中,current_app.name报错。注意在应用程序实例中一个应用级context是如何通过调用app.app_context()来获得的。
5.2、请求调度
当一个应用程序收到客户端的请求,它需要找到响应的视图函数为之服务。对于这个任务,Flask会在应用程序的URL映射中查找请求的URL,该映射包含URLs和操作它们的视图函数。Flask通过app.route装饰器或非装饰器版本app.add_url_rule()来建立这个映射。
看一下Flask应用程序中URL映射是怎样的,你可以在Python shell中检查hello.py创建的映射。测试中,请确保你的虚拟环境是激活状态:
(venv) % python
&&& from hello import app
&&& app.url_map
Map([&Rule '/' (HEAD, OPTIONS, GET) -& index&,
&Rule '/static/&filename&' (HEAD, OPTIONS, GET) -& static&,
&Rule '/user/&name&' (HEAD, OPTIONS, GET) -& user&])
/和/user/&name&路由是由应用程序中的app.route所定义。/static/&filename&路由是由Flask添加,用于访问静态文件的一个特殊路由。你将在第三章学习更多关于静态文件的内容。
URL映射中所示的HEAD、OPTIONS、GET元素为request方法,由路由处理。Flask连接方法到每个路由,这样不同的请求方法发送到相同的URL可以被不同的视图函数处理。HEAD和OPTIONS方法由Flask自动管理,所以实际上可以说,在这个应用程序中URL映射的三个路由都连接到GET方法了。在第四章你将学习为路由指定不同的请求方法。
5.3、请求Hooks
有些时候在每个请求处理之前或之后执行代码是非常有用的。例如,在开始每一个请求前可能有必要创建数据库连接,或对用户请求进行验证。为了避免复制处理这些操作的代码到每一个视图函数中,Flask给你选择注册相同函数来调用,在请求被分配给视图函数之前或之后。
请求hooks由装饰器实现。下面是四个Flask支持的hooks:
(1)before_first_request:在第一个请求被处理前注册一个函数运行。
(2)before_request:在每一个请求前注册一个函数运行。
(3)after_request:如果没有未处理的异常发生,在每一个请求后注册一个函数运行。
(4)teardown_request:即使未处理的异常发生,在每一个请求后注册一个函数运行。
在请求hook函数和视图函数之间共享数据的惯用方法就是使用g全局context。例如,before_request处理程序可以从数据库加载已登录的用户并保存在g.user中。之后,当视图函数被调用,可以从那访问用户。
请求hooks的示例会在未来的章节中展示给大家,所以不用担心,
当Flask调用一个视图函数,并期望它的返回值去响应该请求。大多数的响应是将简单字符串构成的HTML页面发回给客户端。
但是HTTP协议需要比字符串更多的信息作为请求的响应。一个HTTP响应中非常重要的部分是状态码,Flask默认设置200来指示请求已经成功处理。
当视图函数需要用不同的状态码响应,可以在响应文本后添加数字码作为第二个返回值。例如,下面的视图函数返回400错误状态码的请求:
@app.route('/')
def index():
return '&h1&Bad Request&/h1&', 400
视图函数返回的响应还可以携带第三个参数,添加一个头部字典给HTTP响应。通常很少用到,但是你可以在第十四章看到示例。
除了返回一个、两个或三个值的元组,Flask视图函数可以选择返回response对象。make_response()函数可携带一个、两个或三个参数,和视图函数返回的值一样,并返回一个response对象。有时候在视图函数中执行这个转换是非常有用的,然后使用response对象中的方法进一步配置响应。下面的示例创建response对象并设置cookie:
from flask import make_response
@app.route('/')
def index():
response = make_response('
&h1&This document carries a cookie!&/h1&
response.set_cookie('answer', '42')
return response
有一类特殊的响应称作重定向。这类响应不包含页面文档;只是给浏览器一个新的URL去加载新的页面。重定向通常和web表单一起使用,你将在第四章学习。
重定向通常由302响应状态码注明并且重定向的URL由头部的Location给出。重定向响应可以使用三个值的返回生成,也可通过响应对象生成,但是鉴于它频繁的使用,Flask提供redirect()函数来创建这样的响应:
from flask import redirect
@app.route('/')
def index():
return redirect('http://www.example.com')
另一个具有中断功能的特殊响应用来错误处理。下面的示例,当URL给出的id动态参数不是一个合法的用户时返回状态码404:
from flask import abort
@app.route('/user/&id&')
def get_user(id):
user = load_user(id)
if not user:
abort(404)
&h1&Hello, %s&/h1&
' % user.name
注意终止不是指将控制权返回给调用它的函数,而是指通过抛出异常将控制权返回给web服务。
6、Flask扩展
Flask是可扩展的。它故意腾出地给重要的功能,例如数据库和用户授权,给你自由去选择最适合你的应用程序的包,或写一个自己想要的。
社区开发了非常多的扩展用于各种用途,如果这还不够,可以使用任何Python标准包和库。为了让你了解一个扩展是如何并入一个应用程序的,下面的章节给hello.py添加一个扩展,增加应用程序的命令行参数。
6.1、Flask-Script命令行选项
Flask开发,其web服务器支持一系列的启动配置选项,但是配置它们的唯一方式只有在脚本中传递参数给app.run()并调用。这不是非常的方便,理想方法是通过命令行参数传递配置选项。
Flask-Script是给你的Flask应用程序添加命令行解释的扩展。它打包了一组通用的选项,还支持自定义命令。
使用pip安装扩展:
(venv) $ pip install flask-script
下面展示了在 hello.py 应用程序中添加命令行解释的变化。
示例. hello.py:使用Flask-Script
from flask.ext.script import Manager
manager = Manager(app)
if __name__ == '__main__':
manager.run()
专为Flask开发的扩展暴露在flask.ext命名空间下。Flask-Script从flask.ext.script中导出一个名为Manager的类。
初始化这个扩展的方法和其他许多扩展一样:主类实例的初始化是通过将应用程序实例作为参数传递给构造函数实现的。创建的对象适当的用于每一个扩展。在这个示例中,服务器启动通过manager.run()来路由,且命令行在这被解析。
建议:如果你有克隆在GitHub上的应用程序,你现在可以运行git checkout 2c来切换到这个版本的应用程序。
因为这些变化,应用程序获得一组基本的命令行选项。运行hello.py显示可用信息:
$ python hello.py
usage: hello.py [-h] {shell, runserver} ...
positional arguments:
{shell, runserver}
在Flask应用程序上下文的内部运行一个Python Shell。
运行Flask开发服务器,例如:app.run()
optional arguments:
-h, --help
显示这个帮助信息并退出
shell命令用于在应用程序上下文中启动一个Python shell会话。你可以使用这个会话去运行维护任务,或测试,或调试错误。
runserver命令,就像它的名称一样,启动web服务。运行python hello.py runserver在调试模式下启动web服务,还有更多的选项:
(venv) $ python hello.py runserver --help
usage: hello.py runserver [-h] [-t HOST] [-p PORT] [--threaded]
[--processes PROCESSES] [--passthrough-errors] [-d]
运行Flask开发服务器,例如:app.run()
optional arguments:
-h, --help
显示这个帮助信息并退出
-t HOST, --host HOST
-p PORT, --port PORT
--threaded
--processes PROCESSES
--passthrough-errors
-d, --no-debug
-r, --no-reload
--host参数是一个非常有用的选项,因为它能告诉web服务器监听哪个网络接口的客户端连接。默认,Flask开发的web服务器监听localhost的连接,所以只有来自内部计算机运行的服务器可以接收。下面的命令使得web服务器监听公网接口,其他网络上的计算机可以连接:
(venv) $ python hello.py runserver --host 0.0.0.0
* Running on http://0.0.0.0:5000/
* Restarting with reload
现在web服务器应该可以从网络中的任何一台计算机访问 http://a.b.c.d:5000 ,“a.b.c.d”是运行服务的计算机的外部IP地址。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具作者的其他最新日志
评论 ( 个评论)
站长推荐 /1
  3月1日起,除了保留用户登录功能和保存用户的个人空间信息、原始帖文、博客等之外,老版彩龙社区将逐步下线(停用)注册、发帖、回帖等社区功能。看看什么App最先进!安卓应用检测小工具
  Google已经发布了安卓6.0,带来了很多全新特性。但是,令人抓狂的是,很多安卓App尤其是国产App并不会跟进新系统的特性。大量国产App依然用着安卓2.x时代的老旧API,为用户带来卡出天际的体验。那么系统中到底哪些App最先进,可以用上新系统带来的新特性?又有哪些App是食古不化的老顽固?利用这款AppChecker小工具,就能够一下子看出来了。软件名称:应用检测器(AppChecker)软件版本:1.2-b30软件大小:2.09MB软件授权:免费适用平台:Android下载地址:  这款AppChecker小工具翻译成中文就是应用检测器,可以用来检测App的TargetAPI的情况,TargetAPI的安卓版本越高,App也就越先进。这款App的使用很简单,开启后就会罗列出系统已安装的App。在App的列表中,每一个App的TargetAPI都会用安卓版本对应的图标Logo显示,如安卓果冻豆、安卓棒棒糖乃至最新的安卓棉花糖等等的Logo。哪个App支持的安卓特性最先进/最落后,一目了然!(竟然还在用安卓2.3的TargetAPI&&)AppChecker界面,开启后就可以查看已安装App的版本和TargetAPI了能够按照TargetAPI的高低排列App,的TargetAPI低得令人吃惊&&  点击AppChecker左上方的图标,可以切换视图。你可以轻松查看到设备所安装的App支持的TargetAPI的分布情况,例如支持安卓棒棒糖以上新特性的App占所有App的百分之几等等。例如在笔者的设备中,API版本是安卓棒棒糖的App占据了半数以上,这说明大部分App都是以适配安卓棒棒糖这个基准开发的。可以显示系统所安装App的TargetAPI分布,可以统计出每种TargetAPI有多少个App  总的来说,这是一款比较有趣的应用。国产App到底落后到何种程度,国外App到底先进到何种程度,用AppChecker一查便知。如果你想要更多地了解系统中的App,不妨试试这款工具吧!相关阅读:这些功能不能改!公布安卓6.0要求安卓继续中枪!德国电信指控安卓垄断王思聪投资熊猫TV直播!熊猫直播App体验这些App最耗电?最具破坏力安卓App公布&
最新资讯离线随时看
聊天吐槽赢奖品
相关软件:
大小:1.93 MB
授权:免费
大小:62.51 MB
授权:免费使用 IBM Bluemix 开发和部署 Python 应用
本文将从一个开发人员的角度,介绍 Bluemix 运行时对不同应用类型的支持,重点讲解如何使用 Bluemix 平台来开发和部署 Python
类型的应用,主要内容包括:如何使用 Bluemix 开发和部署一个 Python Web 应用,在开发和部署 Python
应用的时候,会用到命令行工具来进行部署,并通过 Bluemix Web 控制台进行管理。最后本文还会结合 Apache Spark 服务来讲解如何在
Bluemix 上通过 Python 来做科学计算和数据分析。环境准备及相关账号申请申请 GitHub 账号本文用到的应用程序的源码是托管在 GitHub 上的,请自行申请 GitHub 账号,申请地址:安装 Git 命令行工具, 使用 Git 命令行可以下载和提交代码到 GitHub。下载地址:注册 Bluemix 账号申请地址: 在页面右上角点击 SIGN
UP,填写相关信息提交申请,Bluemix 会发一封确认邮件到注册邮箱,需要手工进入注册邮箱点击确认,才能成功注册。第一次登陆
Bluemix 控制台的时候,会要求创建工作空间。安装 CloudFoundry 命令行工具通过此工具,可以使用 Cloud Foundry 相关命令与 Bluemix
云环境交互,进行应用的部署,管理和服务的相关操作。参考 什么是 BuildpacksIBM Bluemix 是基于开源云平台 Cloud Foundry 构建的,之所以 Bluemix ( Cloud
Foundry ) 可以支持运行几乎所有类型的应用,其原因是因为引入了 Buildpacks 的概念。通俗的来讲,Buildpacks
主要的功能是:自动的探测应用的类型,并根据应用的类型和开发者提供的应用的描述和依赖,对应用所需的运行时和第三方依赖进行编译打包,最终生成一个由运行时,第三方依赖以及应用程序本身构成的可执行的实体(Droplet),并告知
Bluemix 平台,如何去启动和停止这个实体。从这个功能描述中,我们可以得出,Buidpacks 最终的产生是一个 Droplet,这个
Droplet 可以看成是对应用程序和运行时以及依赖的封装,这种封装对 Bluemix
平台本身屏蔽了一些具体的细节,对于平台来说,最终要运行的实体就是 Droplet,不同的应用类型,最终都会被封装成具有相同格式和接口的
Droplet,这些 Droplet 最终会被平台去运行。正是这种"封装"的机制,保证了几乎所有类型的应用都能在 Bluemix
平台上运行,而且行为一致。如果想要了解更多关于 Buildpacks 和 Droplet 的技术细节,可以访问参考资源。Python Buildpack对于 Python 应用,Bluemix 内置了 Python Buildpack 来对 Python 类型的应用进行支持。Python
Buildpack 同时支持 Python 2 和 Python 3 的应用,但是要求 Python 应用的根目录里至少有一个
requirements.txt 或者 setup.py 文件,否则 Python Buildpack 将不能正常工作。上手 Bluemix Python Buildpack在开始进入动手开发和部署之前,我们先通过 Bluemix 控制台提供的 Python 应用模板在 Bluemix 上部署一个 Python Web
应用,从而对 Python 应用在 Bluemix 上的部署和结构有一个快速的了解。登录 Bluemix 控制台在浏览器中访问 Bluemix 全球站点 http://www.bluemix.net, 点击右上角的"Log In",输入已经注册成功的
Bluemix 账号和密码就能登录到 Bluemix 的控制台。如果是初次登陆,Bluemix
会引导用户创建属于自己的工作空间(Space),读者根据提示完成即可。工作空间用来包含和展示用户的应用,服务以及其他计算资源,是用户和
Bluemix 交互的主要场所。用户可以根据不同的目的和需求来创建不同的工作空间,来对计算资源和应用进行隔离或者分类。图 1. Bluemix
主页登陆成功以后,点击左上角的目录图标,并选择 Apps & Cloud Foundry Apps,然后点击"Create Cloud
Foundry Applications"图 2. 创建第一个 Python
应用Bluemix 预制了大概 10 种不同应用类型的 Buildpacks,Python Buildpack 就是其中之一,如果用户要用到的
Buildpack 没有出现在下面的页面,那么就需要自己到开源社区查找相应的 Buildpack,或者自己来构建需要的
Buildpack,这部分内容没有包含在本文中,感兴趣的读者请查看 Cloud Foundry 的相关文档。在这里我们选择 Python 并点击。图 3. 选择 Python
Buildpack在应用的详细配置页面,指定 App name,Host name 以及 Domain。其中 Host name
必须是唯一的,不能与云上其他的应用同名,请读者自行设置成唯一的命令。默认情况下,App name 和 Host name 是相同的,默认的
Domain 是 mybluemix.net,这个 Domain 是公网可见的,Bluemix
允许用户根据自己的需要设置以上的默认值。最后,点击下方的"Create"创建 Python 应用。图 4. 配置应用详细信息应用创建成功后,控制台会默认调转到该应用程序的导航页面,根据页面左侧的导航,用户可以对应用程序进行信息的查看、管理、配置等等常规操作,我们在这里不再详细介绍控制台的操作,只会选择其中比较相关的几个页面来讲解。关于其他的控制台操作,用户可以自行点击使用。点击左侧的 Overview 按钮,可以查看应用程序的概要信息和进行基本的管理操作。其中 Status 显示的应用程序当下的状态,.py 表明这是一个
Python 的应用,使用的是 Python Buildpack, 点击 View App 可以查看应用的主页和实际的运行效果。图 5. 应用综述在本节开头,我们提到这是一个由 Bluemix
提供的预制模板应用,用户可以选择将这个模板应用的源码下载到本地,然后在此基础上编写应用的逻辑代码,并重新部署到 Bluemix
上发布给目标客户来使用。在控制台的 Getting Started 页面,对以上操作有详细的知道步骤,用户可以自行去尝试。图 6. 下载模板应用源码当然,在大多数场景下,开发者都是首先在本地开发完代码,然后再选择部署到相应的平台去运行应用程序,下节内容将详细介绍,如果在本地开发一个 Python
Web 应用,并通过 Cloud Foundry 命令行部署到 Bluemix 云平台。开发和部署 Python Web 应用到 Bluemix应用场景接下来要开发和部署的这个 Python Web 应用会使用 Bluemix 提供的 dashDB 服务。dasdDB 是一个由 IBM 提供的 SQL
数据库服务,用户可以直接在 Bluemix 上注册使用,不需要在进行本地安装。除了数据存储服务,用户还可以使用 dashDB
来做为数据仓库,并进行数据挖掘等行为。在开发和部署应用程序的过程中,我们会使用 Cloud Foundry
命令行来做为主要的部署工具,同时,还会使用 Bluemix 控制台来对应用进行管理和配置。图 7. 应用架构源码管理应用的源码存储在 Github 上,访问地址是:图 8. 应用源码通过 Git 命令,可以将应用源码克隆到本地,方便我们进行本地开发,当然读者也可以按照下文的步骤一步步从零开始进行应用开发。清单 1.
克隆源码xius-mbp:dw acostry$ git clone https://github.com/acostry/dw-python-dashdb.git
Cloning into 'dw-python-dashdb'...
remote: Counting objects: 10, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 10 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (10/10), done.
Checking connectivity... done.
xius-mbp:dw acostry$ cd dw-python-dashdb/
xius-mbp:dw-python-dashdb acostry$ ls
requirements.txt
dashDB.ddl
runtime.txt本地开发要想实现在 Bluemix 平台运行 Python 应用,至少需要包含以下四个文件:Procfile, requirements.txt,
runtime.txt 以及 app.pyProcfile: 这个文件是应用启动的入口,用来指定当在 Bluemix 上启动 Python
应用时需要运行的命令,比如在我们的例子里是这样设置的:web: python app.py 其中 web
用来表明,我们正在启动的是一个 Web 类型的应用,"python app.py"用来指明需要运行的 Python
脚本。requirements.txt: 这个文件用来指定应用程序所需要的第三方依赖,比如:
Flabskibm_dbFlask 是一个开发 Python Web
应用的开源框架,ibm_db 用来在 Python 应用中连接和使用 dashDB。runtime.txt: 用来指定应用所需要 Python
版本。python-2.7.10app.py: 这个文件就是 Python
应用的脚本或者源代码文件,包含了应用的逻辑。在我们的示例里面,这些代码逻辑主要包含了三部分内容,细节请查看清单 2, 3, 4.清单 2. 读取环境变量
VCAP_SERVICESif 'VCAP_SERVICES' in os.environ:
db2info = json.loads(os.environ['VCAP_SERVICES'])['dashDB'][0]
db2cred = db2info["credentials"]
db2conn = ibm_db.connect("DATABASE="+db2cred['db']+";HOSTNAME="+db2cred['hostname']+";PORT="+str(db2cred['port'])+";UID="+db2cred['username']+";PWD="+db2cred['password']+";","","")这部分代码主要有两个功能:第一,从环境变量 VCAP_SERVICES 里动态读取 dashDB 服务实例的连接信息,并存储在 db2cred
变量里。第二,通过读取的连接信息,建立数据库连接。需要注意的是,只有当应用和 dashDB 数据库实例绑定以后,连接信息才会被写入
VCAP_SERVICES 环境变量,我们这里实现的是动态读取,所以即使还没有绑定数据库实例,代码逻辑也是没有问题的,这也是 Bluemix
推荐的读取 VCAP_SERVICES 信息的方式,不建议硬编码数据库实例信息到代码里,因为被写入环境变量 VCAP_SERVICES
里的信息,有可能会定期的被修改。这也是云上使用服务独有的特点,用户其实不需要关心服务实例具体在哪里,只需要告诉用户通过某种方式可以得到这些连接信息即可。用户需要关心的是如何使用,而不是怎么部署,如何部署以及管理这些服务实例等细节繁琐的问题。关于
VCAP_SERVICES 信息的格式,接下来的章节会讲到。清单 3.
查询数据库记录并在页面显示# main page to dump some enroll information
@app.route('/')
def index():
page = '&title&Welcome dashDB!&/title&'
page += '&h1&Sample IBM Bluemix Python Web Application which connects to dashDB!&/h1&'
if db2conn:
# we have a DB2 connection, so obtain enroll information via enroll table, the enroll information need to be updated to dashDB manually:
stmt = ibm_db.exec_immediate(db2conn,"select * from enroll")
# fetch the result
result = ibm_db.fetch_assoc(stmt)
page += "Enroll Name: "+result["NAME"]+"&br/&Title: "+result["TITLE"]
page += "&br/&Skill: "+result["SKILL"]+"&br/& Company: "+str(result["COMPANY"])
page += "&br/&Country: "+str(result["COUNTRY"])
return page这段代码的主要功能是从数据库的 enroll 表里查询数据,并将数据显示在 page
的主页上。要想让这段代码正常工作,我们需要首先在数据库里新建一张名为 enroll 的表,并插入一些实验数据,这部分内容可以参考下文的操作
dashDB 数据库相关章节。清单 4.
查询数据库记录并在页面显示if __name__ == '__main__':
# Bind to PORT/HOST if defined, otherwise default to 5050/localhost.
PORT = int(os.getenv('VCAP_APP_PORT', '5050'))
HOST = str(os.getenv('VCAP_APP_HOST', 'localhost'))
app.run(host=HOST, port=PORT)绑定 PORT 和 HOST,根据 Cloud Foundry 的要求,运行在 Bluemix
上的应用,必须绑定"VCAP_APP_PORT"和"VCAP_APP_HOST",否则应用将不能被正常启动和运行。说了这么多,让我们开始动手部署应用到 Bluemix 吧!部署 Python 应用到 Bluemixpush 应用到云端命令行登陆: 使用 CF 命令行工具以及注册的 Bluemix 账户和密码登陆到 Bluemix 工作空间
xius-mbp:dw-python-dashdb acostry$ cf api https://api.ng.bluemix.net
Setting api endpoint to https://api.ng.bluemix.net...
API endpoint:
https://api.ng.bluemix.net (API version: 2.54.0)
Not logged in. Use 'cf login' to log in.
xius-mbp:dw-python-dashdb acostry$ cf login
API endpoint: https://api.ng.bluemix.net
Email& xiuleizh@cn.ibm.com
Authenticating...
Select an org (or press enter to skip):
1. xiuleizh@cn.ibm.com
2. OE_Runtimes_SVT
3. BMIX_NG_CNSL_USERS
Targeted org xiuleizh@cn.ibm.com
Select a space (or press enter to skip):
2. dw-space
Targeted space dw-space
API endpoint:
https://api.ng.bluemix.net (API version: 2.54.0)
xiuleizh@cn.ibm.com
xiuleizh@cn.ibm.com
dw-space在应用程序的根目录下,使用 cf push 命令来部署应用到 Bluemix 云平台
xius-mbp:dw-python-dashdb acostry$ ls
requirements.txt
dashDB.ddl
runtime.txt
xius-mbp:dw-python-dashdb acostry$ cf push dw-python-cmd --no-start
Creating app dw-python-cmd in org xiuleizh@cn.ibm.com / space dw-space as xiuleizh@cn.ibm.com...
Creating route dw-python-cmd.mybluemix.net...
Binding dw-python-cmd.mybluemix.net to dw-python-cmd...
Uploading dw-python-cmd...
Uploading app files from: /Users/acostry/Workspace/dw/dw-python-dashdb
Uploading 2.8K, 6 files
Done uploading
OKcf push 后面跟的 dw-python-cmd
是应用的名字,请读者在实际部署的时候另取新的名字并保证是云上唯一的,后面的"--no-start"参数是告诉 Bluemix
暂时不要启动应用,因为这个实例在代码里用到了 dashDB 服务实例,等配置好 dashDB
服务实例以后再来手工启动应用。创建并绑定服务实例创建 dashDB 服务实例 xius-mbp:dw-python-dashdb acostry$ cf create-service dashDB Entry dashDB-Sample
Creating service instance dashDB-Sample in org xiuleizh@cn.ibm.com / space dw-space as xiuleizh@cn.ibm.com...
Attention: The plan `Entry` of service `dashDB` is not free.
The instance `dashDB-Sample` will incur a cost.
Contact your administrator if you think this is in error.cf create-service 后面有三个参数,第一个 dashDB 是所有服务的名称。第二个
Entry 指的是相应服务的 plan,plan
是和计价相关的概念,读者只需暂时记住就可以了,至于具体的计价信息,可以到服务的文档查看。第三个参数 dashDB-Sample
是所要创建的服务实例的名称,这个名称用户可以自行设定。在命令输出的最后有一个 Attention,这里是告知用户正在使用的服务
是一个收费的服务。但是对于试用用户可以放心使用,每个服务都有一定的免费使用期限和用量,可以放心使用,并不会产生任何费用。绑定服务实例到具体应用 xius-mbp:dw-python-dashdb acostry$ cf bind-service dw-python-cmd dashDB-Sample
Binding service dashDB-Sample to app dw-python-cmd in org xiuleizh@cn.ibm.com / space dw-space as xiuleizh@cn.ibm.com...
OKcf bind-service 后面需要跟两个参数,一个是具体应用的名字,另外一个是所要绑定的
服务的实例名字。当绑定服务成功后,系统会提示 restage
应用,基本上就是要进行一次应用的重启来使绑定生效。因为在绑定的过程中会有一些服务信息被写入到相关的环境变量里,通过 restage
可以激活这些信息。在控制台验证应用和服务通过上面的操作,已经成功的部署了一个名为 dw-python-cmd 的应用到运行,并且创建并绑定了
dashDB 数据库实例 dashDB-Sample 到该应用。参照前文的方法,登陆 Bluemix
控制台用户界面,点击左上角的目录按钮,选择 Apps & Dashboard,在控制台上查看应用和服务的列表。图 9.
应用和服务列表分别单击应用和服务实例的名字就可以进入相应的显示和配置管理页面。在这里,我们点击 dw-python-cmd
进入到应用的管理页面,并选择 Runtime & Environment Variables,这里可以查看到我们之前提到的
VCAP_SERVICS 的具体信息,在上文提到的清单 2 里实际处理的就是这部分信息。基本上每一种服务都会有相关的
VCAP_SERVICES
信息和描述,用户需要首先了解这些信息,才能在自己的应用程序里正确的使用这些服务。VCAP_SERVICES
是服务与应用交互的接口和桥梁,读者可以自行查看每一种服务的文档来了解更过关于本服务的 VCAP_SERVICES
信息的细节。图 10.
环境变量 VCAP_SERVICES初始化 dashDB 数据库前文提到,app.py 会从一个叫做"enroll"的表里来查找数据,本节的主要内容就是介绍如何通过控制台在 dashDB
数据库中创建表并插入数据。在图 9 显示的服务列表里,点击 dashDB-Sample 进入到 dashDB 服务的管理页面:图 11. dashDB
主页在上图中,点击"OPEN"打开 dashDB 数据库实例的管理界面,并单击左侧列表中的"Run SQL"图 12. dashDB Run
SQL 视图清空上图中的示例 SQL 语句,在运行框里输入如下 SQL 语句,并点击"Run All"执行 SQL,完成数据库的初始化。清单 5.
初始化数据库实例create table enroll(name varchar(50) not null primary key, title varchar(50), skill varchar(50), company varchar(50), country varchar(30));
insert into enroll values ('acostry', 'Software Engineer', 'Cloud Computing', 'IBM', 'China');图 13. 执行 SQL 视图如果碰到执行 SQL 失败,请多尝试几次或者换个时间段来执行,这是因为我们使用的 Bluemix
数据中心位于国外,经常会因为网络的问题出现各种未知错误。启动并验证应用使用 cf start 命令来启动已经部署的应用 xius-mbp:dw-python-dashdb acostry$ cf start dw-python-cmd
Starting app dw-python-cmd in org xiuleizh@cn.ibm.com / space dw-space as xiuleizh@cn.ibm.com...
-----& Downloaded app package (4.0K)
-------& Buildpack version 1.5.5
-----& Installing python-2.7.10
$ pip install -r requirements.txt
DEPRECATION: --allow-all-external has been deprecated and will be removed in the future. Due to changes in the repository protocol, it no longer has any effect.
Collecting Flask (from -r requirements.txt (line 1))
Downloading Flask-0.11.1-py2.py3-none-any.whl (80kB)
Collecting ibm-db (from -r requirements.txt (line 2))
Downloading ibm_db-2.0.7.tar.gz (553kB)
Collecting click&=2.0 (from Flask-&-r requirements.txt (line 1))
Downloading click-6.6.tar.gz (283kB)
Collecting itsdangerous&=0.21 (from Flask-&-r requirements.txt (line 1))
Downloading itsdangerous-0.24.tar.gz (46kB)
Collecting Werkzeug&=0.7 (from Flask-&-r requirements.txt (line 1))
Collecting Jinja2&=2.4 (from Flask-&-r requirements.txt (line 1))
Downloading Jinja2-2.8-py2.py3-none-any.whl (263kB)
Collecting MarkupSafe (from Jinja2&=2.4-&Flask-&-r requirements.txt (line 1))
Downloading MarkupSafe-0.23.tar.gz
Installing collected packages: click, itsdangerous, Werkzeug, MarkupSafe, Jinja2, Flask, ibm-db
Running setup.py install for click: started
Running setup.py install for click: finished with status 'done'
Running setup.py install for itsdangerous: started
Running setup.py install for itsdangerous: finished with status 'done'
Running setup.py install for MarkupSafe: started
Running setup.py install for MarkupSafe: finished with status 'done'
Running setup.py install for ibm-db: started
Running setup.py install for ibm-db: finished with status 'done'
Successfully installed Flask-0.11.1 Jinja2-2.8 MarkupSafe-0.23 Werkzeug-0.11.11 click-6.6 ibm-db-2.0.7 itsdangerous-0.24
You are using pip version 8.1.1, however version 9.0.1 is available.
You are using pip version 8.1.1, however version 9.0.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
-----& Uploading droplet (62M)
0 of 1 instances running, 1 starting
1 of 1 instances running
App started
App dw-python-cmd was started using this command `python app.py`
Showing health and status for app dw-python-cmd in org xiuleizh@cn.ibm.com / space dw-space as xiuleizh@cn.ibm.com...
requested state: started
instances: 1/1
usage: 1G x 1 instances
urls: dw-python-cmd.mybluemix.net
last uploaded: Tue Nov 15 07:14:00 UTC 2016
stack: cflinuxfs2
buildpack: python 1.5.5
08:35:25 PM
83.9M of 1G
214.5M of 1G当使用 cf start 命令来启动应用的时候,Bluemix 平台会自动去探测应用类型,
并安装相应的运行时环境:Installing python-2.7.10安装应用程序定义的第三方依赖:$ pip
install -r requirements.txt生成并上传 Droplet:Uploading droplet
(62M)启动应用:App dw-python-cmd was started using this command
`python app.py`最后给出应用的访问地址等信息:urls:
dw-python-cmd.mybluemix.net验证应用是否启动成功在浏览器中输入应用的访问地址,比如: 如果看到如下页面,则表明应用启动正常,并从
dashDB 中成功获取的查询信息。图 14. 访问应用使用 Apache Spark 服务和 Python
进行科学计算和数据分析科学计算和数据分析是 Python 语言应用比较多的领域,Bluemix 对使用 Python 来进行科学计算和数据分析也提供了全面的支持。Apache Spark 服务介绍Apache Spark 是开源的集群计算框架,主要用于海量数据的计算和分析。IBM Analytics for Apache Spark 服务将
Spark 与 notebook 相结合,可以使用户非常方便的在 Bluemix 上进行科学计算和数据分析。用户只需要几次点击操作就能创建一个
Spark 集群,不需要进行复杂的安装和配置,非常快速的就能体验到 Spark 服务带来的便利。登陆 Bluemix,并点击 Catalog
可以查看更多关于 Apache Spark 服务的介绍。图 15.
IBM Analytics for Apache Spark使用 IPython Notebook 和 Spark 进行数据分析在开始进行数据分析之前,需要首先创建 Spark 服务实例,登陆 Bluemix,点击左上角目录按钮,选择 Services &
Data&Analytics , 在显示页面里点击 Analytics,如下图所示:图 16. 选择数据分析服务在上图中,点击"NEW INSTANCE"创建一个新的 Spark 服务实例,在弹出页面里设置实例的名称和工作的空间,并点击"CREATE
INSTANCE"图 17. 创建 Spark
实例Spark 实例创建成功以后,会跳转到 My Notebooks 页面,在这里点击"NEW NOTEBOOK"来创建一个新的 Notebook图 18. My
Notebooks在创建 Notebook 的时候,我们可以选择创建一个空白的 Notebook,或者上传一个已经存在的 Notebook,同时也可以选择使用
Bluemix 预制的样本来创建。图 19. 创建空白
Notebook为了方便我们讲解 IPython Notebook 的使用,我们在这里使用 Bluemix 预制的样本来创建一个 Notebook图 20. 创建样本
Notebook点击"CREATE NOTEBOOK"创建一个基于样本的 IPython Notebook,如下图所示。红方框里是功能按钮用来帮助在 IPython
Notebook 里运行 Python 脚本。右上角的 Notebook Tools 可以帮助用户更好的来使用和管理
Notebook,其中:Data Sources:
用来导入和管理数据源,这些数据源就是被用来进行数据分析的原始数据,用户可以选择从本地的数据文件进行导入,也可以选择已经存储在 Bluemix
上的数据源进行导入Notebook Info: 用来展示和 Notebook 相关的描述信息,比如名称和类型等等Environment:用来显示 Python 和 Spark 的版本以及预先安装的第三方 Python 类库,这些第三方类库已经由
Bluemix 平台预先安装,用户可以直接使用,不需要再进行独立安装Sharing:用来帮助用户将正在工作的 Notebook 分享给更多的人,用户可以选择将 Notebook
分享给有限的人,或者也可以选择分享给所有拥有分享链接的人图 21. IPython
Notebook关于 IPython Notebook 更多的使用方法,读者可以根据样本程序的引导来进行更全面的学习。同时也可以参考文章
了解更多具体的用法和功能。总结在本文中,我们首先介绍了 Bluemix 里的 Buildpacks 机制,进而引出 Python Buildpack。然后通过一个实例来演示如何在
Bluemix 上开发和部署 Python 应用。最后向读者介绍了如何使用 Apache Spark 服务和 Python
来进行科学计算和数据分析。读完本篇文章,相信读者应该已经对在 Bluemix 上如何使用 Python
和相关服务有了比较深刻的理解,并应该具备了够独立部署 Python 应用到 Bluemix 云平台的能力。参考资源 (resources)
添加或订阅评论,请先或。
有新评论时提醒我
static.content.url=http://www.ibm.com/developerworks/js/artrating/SITE_ID=10Zone=Cloud computing, Open sourceArticleID=1040405ArticleTitle=使用 IBM Bluemix 开发和部署 Python 应用publish-date=}

我要回帖

更多关于 npm run dev 热部署 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信