用Flask和Oracle移动云服务构建一个应用程序


用Flask和Oracle移动云服务构建一个应用程序

Synapse团队由Josh Cohen、Jacob Hoffman、Jordan Hank和John Morgan组成,他们是斯坦福大学计算机科学专业的学生,对利用计算机科学促进社会公益有着共同的兴趣。他们邀请您在GitHub上为Synapse项目做出贡献。

在Synapse,我们一直在开发一个 "低数据 "应用程序,目的是在灾难发生后众包、验证和重新分配信息。

虽然我们的特殊用例带来了特殊的挑战,例如最大限度地减少请求的大小和获取新信息所需的往返次数,但我们的许多目标与任何大型移动 Web 应用程序相同。

除了可扩展的、基于云的后端,我们希望有一个堆栈,使我们能够与设备无关,从许多不同来源插入信息,处理大量数据,并尽可能简单、高效地管理请求。为了实现这些目标,我们在客户端使用React Native,在API使用Flask,在数据库使用MySQL。不要错过每个Node开发者必须掌握的10个JavaScript概念。| 构建Node应用程序的7个关键。

在后端和客户端之间,还有一个重要的层。Oracle移动云服务。我们使用移动云服务来简化客户端请求的管理,使请求和响应尽可能小,并通过 Oracle 的内置服务轻松跟踪关键性能指标。

在本文中,我们将指导您设置环境,用 Flask 定义 API,在移动云服务上进行部署,并从客户端提出自定义请求。这些说明并不是针对Synapse应用的,而是可以作为大多数移动Web应用的基础。如果你想了解更多关于Synapse应用程序的信息,你可以在这里阅读。

注意,我们在Oracle计算虚拟机上用SQLAlchemy启动了Flask API。这个RESTful框架让我们有端点来轻松查询我们的MySQL数据库,然后根据需要打包这些信息并转发出去。如果你喜欢使用不同的SQL数据库,有可能SQLAlchemy支持它。

用Flask创建一个API

我们将在虚拟环境中运行我们的Flask应用程序。

> virtualenv rest-api> source rest-api/bin/activate

现在我们在 virtualenv 中工作,我们将安装我们的依赖项。

> pip install flask> pip install flask-restful> pip install sqlalchemy> pip install MySQL-python

Flask是我们的框架,而flask-restful包括处理请求和定义端点的有用导入。SQLAlchemy将让我们连接到我们的MySQL服务器,而MySQL-python是允许SQLAlchemy这样做的包。

让我们在一个新的Python文件(filename.py)中定义我们的API。我们需要从我们的包中导入以下内容:

from flask import Flask, requestfrom flask_restful import Resource, Api, abort, reqparsefrom sqlalchemy import *from json import

然后我们将创建SQLAlchemy引擎。这将处理执行我们所有的数据库命令。

e = create_engine('mysql://user:password@localhost/DBame')

其中user和password是你的MySQL证书,localhost和DBName是你要连接的数据库的地址和名称。

接下来我们将添加几行Flask模板,包括一个请求解析器来帮助我们处理参数。

app = Flask(__name__)api = Api(app)parser = reqparse.RequestParser()parser.add_argument('event_id', type=int)

现在对于每个 API 端点,我们定义一个类,将一个资源作为参数输入。这个类将连接到数据库,构建一个 SQL 查询,执行它,然后返回一个响应和状态代码。

这里是一个端点的例子,我们查询数据库中一个名为 event 的表中的每一行。

# (GET) 查看事件信息的端点class Event_Info_All(Resource): def get(self): conn = e.connect() command ="SELECT * FROM event" query = conn.execute(command) response = {'data': [dict(zip(tuple (query.key()) ,i)) for i in query.cursor]} return response, 200

当然,我们需要将我们定义的每个资源(端点)添加到我们的 API 中。

api.add_resource(Event_Info_All, 'event/info/all')

这将我们刚刚定义的 Event_Info_All 类添加到我们 Flask API 的 URL /event/info/all 处。当它被部署时,点击端点 host/event/info/all(其中 host 是我们 Flask API 主机的 URL)将返回我们数据库中的所有事件。

我们最后一块模板是让我们的应用程序运行。在文件的最后,我们将添加:

if __name__ == '__main__': app.run()

这将允许我们使用任何主机选项来启动和运行我们的 API。所以,现在我们有了一个带有一个端点的API。你可以通过运行

> python filename.py

对于我们的生产部署,我们使用Nginx和uWSGI托管这个API。我们使用uWSGI和帝王服务来确保我们的Flask API始终处于运行状态,并记录潜在的错误。你可以在Flask文档中研究更多的托管选项。

使用Oracle移动云服务创建后端

Oracle移动云服务(MCS)提供了一个Web UI来管理后端和API。在这里,我们将引导你完成用Flask API初始化MCS层的步骤。导航到移动云服务页面。首先,创建一个移动后端,它在应用程序标签下。然后,通过导航到API标签来定义一个新的API。这是客户在连接到MCS时将会碰到的API的定义。

你可以上传一个RAML文件或使用一个向导界面来定义每个端点。我们选择在RAML中定义我们的API,因为无论如何向导只是写到一个可编辑的RAML文件。继续我们在Flask API中定义的端点,我们的RAML的原始版本看起来像这样:

#%RAML 0.8title: apiNameversion: 1.0protocols: [HTTPS]baseUri。/mobile/custom/apiNamemediaType: application/json/event。/info: /all: get: responses: 200: body: application/json: example: | {}

我们从一些RAML模板开始,其中apiName是你自定义API的名称。然后我们在MCS上定义一个端点,作为/event/info/all的API的一部分,它将发送一个JSON响应。

接下来,当API被打开时,你可以通过点击右上角的编辑图标来编辑RAML文件。然后点击JavaScript Scaffold按钮。这将下载一个包含必要的Node.js文件的压缩文件,以写出你的API的实际实现。你将在文件apiName.js中编写所有代码,其中apiName是你的API的名称。

该支架将为你定义的每个端点提供函数定义。到目前为止,我们的只有一个。我们将使用一个名为Request的包来向我们的Flask API发出请求,所以如果你已经正确安装了Node.js和NPM,请运行

> npm install -save request

将这个依赖性添加到你的package.json文件。然后在你的Node.js文件的顶部添加

var request = require('require');

现在我们有了实现我们的端点所需要的一切。在每个端点,我们要确保对MCS的请求收到适当的状态代码,然后向我们的后端发出另一个请求,然后再对数据进行任何转换,并将最终的响应发回给客户端。要直接转发这个响应,我们的实现会是这样的:

service.get('/mobile/custom/apiName/event/info/all', function(req,res) { var result = {}; if (res.statusCode == 200){ request('http://flaskAPIHost/event/info/all', function(error, response, body) { if (response. statusCode === 200){ result = body; } else { console.warning(response.statusCode); result = { 'statusCode': response.statusCode, 'body': body }; } res.type('application/json'); res.status(response.statusCode).send(result); }) });

MCS最有用的功能之一是控制台能够记录和跟踪每个请求。一旦部署完毕,如果你导航回移动后端并打开它,你会看到一个显示状态更新和日志的简单仪表板。任何时候你使用console.log,一个新的日志条目就会被创建。你也可以使用console.info()、console.warning()或console.severe()。所有的日志都会到同一个地方,但有不同的标签。这对于测试你的实现非常方便。

当你完成你的实现时,压缩文件夹并将其上传到你下载脚手架的同一个实现页面。一旦它被上传,该实现就会被连接到API上。MCS的最后一步是导航到您创建的移动后端,并在其API选项卡中添加您现在的功能API。

建立客户端连接

现在我们准备开始从客户端向MCS发出请求。我们选择用React Native构建我们的客户端,这意味着我们的客户端代码是用JavaScript编写的。我们最初想先为安卓开发(因为它有大量的国际用户),但选择了React Native,因为它可以让我们轻松地在未来的iOS上部署。因为MCS有一个为网络应用程序设计的JavaScript SDK,所以React Native很容易被纳入。从移动云服务中下载JavaScript SDK,方法是进入应用程序,然后从页面的右上方点击SDK下载。然后,在你的 JavaScript 文件中,在你想发出请求的任何地方,添加

var mcs = require('./pathToMCSSDKFolder/mcs');

你可能想在生产中使用 mcs.min,在开发中使用 mcs。你还需要用MCS的必要信息来设置你的mcs_config文件,你可以在这里找到更多信息。你可以对它进行配置,这样它就可以用require导入,或者你可以把它放在你要调用MCS的同一个文件里。

在你向MCS发出任何请求之前,你需要初始化MCS后端并登录。

mcs.mobileBackendManager.platform = new mcs.BrowserPlatform();mcs.mobileBackendManager.setConfig(mcs_config);var mcsBackend = mcs. mobileBackendManager.getMobileBackend("synapse");if(mcsBackend != null){ mcsBackend.setAuthenticationType("basicAuth");}

然后你需要通过你喜欢的方法在MCS上进行认证,传入一个成功和失败回调。我们选择了简单地使用匿名认证,但MCS的优势之一是它通过各种系统为你处理认证,调用方式几乎与此完全相同:

mcsBackend.Authorization.authenticateAnonymous(success, failure);

现在,为了真正向我们的端点发出请求,我们将调用mcsBackend.CustomCode.invokeCustomJournal()。

mcsBackend.CustomCode.invokeCustomJSONRequest(API_URL, "GET", null, requestSuccess, requestFailure);

就这样,MCS SDK为你处理几乎所有的请求逻辑。

现在,您已经拥有了使用 Oracle 移动云服务部署端到端应用程序所需的一切,包括从本地客户端发出请求的简便方法。虽然我们已经为使用Flask API从MySQL实例中抓取数据打下了基础,但您可以轻松地换上不同的数据库。使用移动云服务的连接器API,你也可以从许多其他来源获取数据。

新技术论坛提供了一个探索和讨论新兴企业技术的场所,其深度和广度是前所未有的。选择是主观的,是基于我们认为重要的和InfoWorld读者最感兴趣的技术的挑选。InfoWorld不接受用于出版的营销材料,并保留编辑所有投稿内容的权利。请将所有询问发送至:newtechforum@infoworld.com。


本文标签

热门标签

会员评论