如何在Heroku虚拟实例(dyno)中使用参数触发Python函数?

时间:2017-06-03 07:19:31

标签: python heroku redis

上下文

我对Swift和iOS非常熟悉。我熟悉Python编程语言并编写纯python代码(纯粹的'我的意思是,不使用像Django或Flask这样的模块,我对此一无所知)。我对服务器端架构完全陌生。

我一直在阅读一本关于Redis的书,它使用Python和Python Redis客户端(Redis的人员推荐)用于它的例子。

我最近学到了什么'虚拟化'是,并且足以让我知道我应该使用像Heroku这样的PaaS,而不是像AWS这样的IaaS一起编组组件,因为这是我第一次尝试制作服务器支持的iOS应用程序。

场合

我想使用Redis存储简单排行榜的数据。我使用的是Redis Labs的Redis(e)Cloud,它是Redis的服务。我可以使用python和redis-cli从我的终端连接到这个。

对后端的要求很少而且简单:通过排行榜分数得分。并增加分数。

我一直在阅读Heroku的文档,我起草了这个简单的设计:iOS客户端向Heroku dynos发出GET请求。 dynos将使用python和redis python客户端连接到Redis(e)云提供的Redis,然后将该数据发送回iOS客户端。 iOS客户端也可以向dynos发出POST请求,这将增加Redis中的值。我有客户端请求等待Redis数据,因为响应时间应该很快,而且数据很轻。

我在想的是,我已经拥有了网络' dynos,它将运行一个导入redis的python文件,并且有一个引用redis连接的变量。而且它还具有从redis页面数据并返回它的功能。以及此处省略的增量分数函数。

import redis
conn = StrictRedis(host='...', port=...)

def page_leaderboard(page_number):
    ...

    return data

我想,iOS客户端会发出一个GET请求,其中包含要为排行榜检索的页码,Heroku dyno将连接到redis,并将该数据传回客户端。

我了解包含以下内容的Heroku Procfile将运行特定文件:

web: python some_file.py

但我不知道如何触发特定功能。我想也许它就像是:web:python from some_file import some_file; page_leaderboard(X)。但我不确定。然后我不知道如何从客户端GET请求获取页码数据以将其作为参数传递给函数。而且我不知道函数的return语句是否会将redis数据发送回客户端。

我遇到了一个名为Flask的东西,但人们使用术语“网络应用程序”#39;在Flask的文章中我很困惑,如果我应该使用Flask,因为我没有建立一个网站,而且我目前对“网络应用程序”的定义有所了解。是#34;一个在网络浏览器中运行的应用程序"。

或者我是在错误的轨道上,这不是一个好设计/不是如何做事?

1 个答案:

答案 0 :(得分:1)

你走在正确的轨道上。 A"网络应用程序"不一定是在浏览器中运行的一个(尽管该术语的使用可能正在转移)。我认为Web应用程序是通过HTTP提供的应用程序,而您的应用程序就是这样。

所以Flask是如何在Python中编写它的绝佳选择。这里有一些代码可以帮助您入门。 (一旦您准备好大规模运行此功能,您应该考虑在Flask应用前面部署Gunicorn。)

import os

from flask import Flask

app = Flask(__name__)

@app.route("/leaderboard")
@app.route("/leaderboard/<int:page_number>")
def get_leaderboard(page_number=0):
    return "This should return the results for page {}".format(page_number)

if __name__=="__main__":
    # This line uses the PORT environment variable (set by Heroku) to
    # determine what port to host the app on. If you run this locally,
    # you should either set the PORT environment variable yourself or
    # access the app via the default port 5000. E.g.
    # curl http://127.0.0.1:5000/leaderboard/2
    app.run(host="0.0.0.0", port=int(os.environ.get("PORT", 5000)))

您的Procfile可以只是:

web: python some_file.py

作为旁注,页码在这种情况下并不总是很好用。想一想如果在用户正在查看第1页时,如果新的高分出现在列表顶部会发生什么,当他们滚动到第2页时,他们最终会看到重复的高分吗? (第一页上的最后一个分数现已被推到第2页的顶部。)也许这些东西都没问题,但另一种方法是设计一个类似于&#34的API;告诉我10个最高分低于X。&#34;