如何使发布请求与 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 ngrok
和 ngrok.connect(5000)
。 Boom,现在你有一条通往 Flask 开发服务器的隧道了。
【讨论】:
以上是关于如何使发布请求与 ngrok 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
将 localtunnel\ngrok 与多个本地站点一起使用
如何将 2 个或多个 Http 隧道(例如 ngrok)与 2 个或多个 .net 不同的应用程序(需要处理图形 api 的不同订阅)一起使用?