如何使发布请求与 ngrok 一起使用?

Posted

技术标签:

【中文标题】如何使发布请求与 ngrok 一起使用?【英文标题】:How to make post requests work with ngrok? 【发布时间】:2020-08-21 03:09:36 【问题描述】:

我正在使用 python 开发应用程序。我正在做一些测试,看看它是如何工作的。

首先我用 Flask 尝试了这段代码

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
    return 'The GET works'

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

而且效果很好。然后,因为我希望每个人都可以访问我的应用程序,所以我使用了 ngrok,我只是在控制台中输入:

./ngrok http 5000

它运行良好,我可以从任何地方访问 URL,但是对于我的应用程序,我需要能够从任何地方发出 POST 请求。但是每当我尝试发出这样的帖子请求时

import requests
r = requests.post('http://10d2b892.ngrok.io/',data='key':'value')

r 返回响应 [405],我无法发布任何内容。 我应该怎么做才能使 Post 请求起作用?

【问题讨论】:

【参考方案1】:

正如documentation 所述,您应该使用注释:

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_the_login_form()

【讨论】:

【参考方案2】:

ngrok 将转发您发送的任何 http 请求。您的问题是 Flask 应用程序不是为了处理发布请求而编写的。关于这一点,我假设您是 Flask 的新手,并建议您立即切换到 FastAPI:

from fastapi import FastAPI

app = FastAPI()

@app.get('/', status_code=200)
def index():
    return 'message':'Hello, World!'

@app.post('/', status_code=201)
def index_post():
    return 'message':'Hello, Post!'

我相信无论从短期还是长期来看,它都会让您的生活更轻松。如果您还使用 Uvicorn 运行它,您将有一个良好的开端:

from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.get('/', status_code=200)
def index():
    return 'message':'Hello, World!'

@app.post('/', status_code=201)
def index_post():
    return 'message':'Hello, Post!'

if __name__ == "__main__":
    uvicorn.run(
        "views:app", 
        host="localhost", 
        port=5000,
        reload=True    
    )

继续并将该文件命名为views.py

创建您的虚拟环境 (venv):

python3 -m venv venv

来源

source venv/bin/activate

安装模块

pip install uvicorn fastapi

并运行它

python views.py

现在您可以使用 ngrok 访问它

ngrok http 5000

当您在views.py 中保存更改时,您的 uvicorn 服务器将自动重新启动,您应该能够在不重新启动任何东西的情况下尝试您的更改。

希望这能让你继续前进。

【讨论】:

【参考方案3】:

你快到了。您正在使用的注释

@app.route("/")

使用GET 方法创建默认路由,但您尝试使用POST。由于您没有定义POST,因此您会得到405 Method Not Allowed。要解决这个问题,只需定义POST,如文档中的here

@app.route('/', methods=['GET', 'POST'])

另外,您还可以在 Python 脚本中使用 pyngrok 管理 ngrok。有一个 Flask 记录示例 here,但如果是简短的,您只需执行 from pyngrok import ngrokngrok.connect(5000)。 Boom,现在你有一条通往 Flask 开发服务器的隧道了。

【讨论】:

以上是关于如何使发布请求与 ngrok 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

将 localtunnel\ngrok 与多个本地站点一起使用

如何将 2 个或多个 Http 隧道(例如 ngrok)与 2 个或多个 .net 不同的应用程序(需要处理图形 api 的不同订阅)一起使用?

将 DDNS (noip.com) 与 ngrok 一起使用

如何在 google colab 中使用 ngrok?

无法将 Ngrok 与 Vagrant 连接

无法让 Twilio 应用程序与 ngrok 一起正常工作