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

2024-04-23 23:11:19 发布

您现在位置:Python中文网/ 问答频道 /正文

上下文

我对Swift和iOS非常熟悉。我熟悉Python编程语言并编写纯Python代码(我所说的“pure”是指不使用Django或Flask之类的模块,我对此一无所知)。我对服务器端架构是完全陌生的。你知道吗

我读过一本关于Redis的书,它使用Python和pythonredis客户机(Redis的人推荐的)作为例子。你知道吗

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

形势

我想用Redis来存储简单排行榜的数据。我使用Redis实验室的Redis(e)云,这是Redis作为一种服务。我可以使用python和redis cli从终端连接到它。你知道吗

对后端的要求很少,也很简单:在有分数的排行榜上翻页。以及不断增加的分数。你知道吗

我一直在阅读Heroku的文档,我起草了一个简单的设计:iOS客户端向Heroku dynos发出GET请求。dynos将使用python和redis python客户端连接到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 from some\ u file import some\ u file;page\ leadboard(x)。但我不确定。然后我不知道如何从客户机get请求获取页码数据,以将其作为参数传递给函数。我不知道函数的return语句是否会将redis数据发送回客户端。你知道吗

我遇到了一个叫做Flask的东西,但是人们在Flask的文章中使用了“web应用程序”这个术语,所以我很困惑我是否应该使用Flask,因为我没有创建一个网站,我目前对“web应用程序”的定义的理解是“在web浏览器中运行的应用程序”。你知道吗

或者我走错了方向,这不是一个好的设计/不是怎么做的?你知道吗


Tags: 文件数据函数redisweb应用程序客户端flask
1条回答
网友
1楼 · 发布于 2024-04-23 23:11:19

你在正确的轨道上。“web应用程序”不一定是在浏览器中运行的(尽管这个术语的用法可能正在改变)。我认为web应用程序是通过HTTP提供服务的应用程序,而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页的顶部)也许这些都没问题,但是另一种选择是设计一个API,比如“告诉我低于X的10个最高分数。”

相关问题 更多 >