Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Heroku虚拟实例(dyno)中使用参数触发Python函数?_Python_Heroku_Redis - Fatal编程技术网

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

如何在Heroku虚拟实例(dyno)中使用参数触发Python函数?,python,heroku,redis,Python,Heroku,Redis,上下文 我非常熟悉Swift和iOS。我熟悉Python编程语言并编写纯Python代码(我所说的“纯”是指不使用Django或Flask等我一无所知的模块)。我对服务器端体系结构是完全陌生的 我一直在读一本关于Redis的书,书中使用Python和Python Redis客户端(Redis的同事推荐)作为示例 我最近学到了什么是“虚拟化”的基础知识,并且对AWS有了足够的了解,我知道我应该使用像Heroku这样的PaaS,而不是从像AWS这样的IaaS中编组组件,因为这是我第一次尝试制作服务器

上下文

我非常熟悉Swift和iOS。我熟悉Python编程语言并编写纯Python代码(我所说的“纯”是指不使用Django或Flask等我一无所知的模块)。我对服务器端体系结构是完全陌生的

我一直在读一本关于Redis的书,书中使用Python和Python Redis客户端(Redis的同事推荐)作为示例

我最近学到了什么是“虚拟化”的基础知识,并且对AWS有了足够的了解,我知道我应该使用像Heroku这样的PaaS,而不是从像AWS这样的IaaS中编组组件,因为这是我第一次尝试制作服务器支持的iOS应用程序

形势

我想使用Redis来存储简单排行榜的数据。我正在使用Redis实验室的Redis(e)云,这就是Redis的服务。我可以使用python和redis cli从我的终端连接到它

对后端的要求很少,而且很简单:在排行榜上翻阅分数。和增加分数

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

我当时想的是,我将使用“web”dynos,它将运行一个python文件,该文件导入了redis,并且有一个引用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从某个文件导入某个文件;第页(x)排行榜。但我不确定。然后我不知道如何从客户端get请求获取页码数据,以将其作为参数传递给函数。我不知道函数的return语句是否会将redis数据发送回客户端

我遇到了一种叫做Flask的东西,但人们在Flask的文章中使用了“web应用程序”一词,因此我很困惑我是否应该使用Flask,因为我不是在制作网站,我目前对“web应用程序”定义的理解是“在web浏览器中运行的应用程序”


还是我走错了方向,这不是一个好的设计/不是如何做事?

你走对了方向。“web应用程序”不一定是在浏览器中运行的应用程序(尽管该术语的用法可能正在发生变化)。我认为web应用程序是通过HTTP提供服务的应用程序,而您的应用程序就是HTTP

因此,Flask对于如何用Python编写这篇文章是一个很好的选择。这里有一些代码可以帮助您入门。(一旦你准备好大规模地运行它,你应该看看在你的Flask应用程序前面部署。)


作为补充说明,页码在这种情况下并不总是很有效。仔细想想,当用户查看第1页时,如果一个新的高分出现在列表的顶部会发生什么。当他们滚动到第2页时,他们会看到重复的高分吗?(第一页上的最后一个分数现在被推到了第2页的顶部。)也许这些都没问题,但另一种选择是设计一个API,如“告诉我低于X的10个最高分数”。

非常感谢您的帮助smarx:)以及澄清我对web应用程序的理解。它正在工作,我非常兴奋D我没有想到分页的边缘情况;非常感谢。我接受你的建议。
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)))
web: python some_file.py