Python 如何使post请求与ngrok一起工作?
我正在使用python开发一个应用程序。我正在做一些测试,看看它是如何工作的 首先,我用Flask尝试了这个代码Python 如何使post请求与ngrok一起工作?,python,flask,post,request,ngrok,Python,Flask,Post,Request,Ngrok,我正在使用python开发一个应用程序。我正在做一些测试,看看它是如何工作的 首先,我用Flask尝试了这个代码 from flask import Flask app = Flask(__name__) @app.route("/") def hello(): return 'The GET works' if __name__ == "__main__": app.run() 而且效果很好。然后,因为我希望每个人都能访问我的应用程序,所以我使用了ngrok,我只是在控制台
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请求生效 如所述,您应该使用注释:
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()
ngrok
将转发您发送的任何http请求。您的问题是Flask应用程序不是为处理post请求而编写的。在这一点上,我假设您是Flask的新手,并建议您立即切换到FastAPI:
从fastapi导入fastapi
app=FastAPI()
@app.get(“/”,状态代码=200)
def index():
返回{'message':'Hello,World!'
@app.post(“/”,状态代码=201)
def index_post():
返回{'message':'Hello,Post!'
我相信无论从短期还是长期来看,它都会让你的生活变得更轻松。如果您还使用Uvicorn运行它,您将有一个良好的开端:
从fastapi导入fastapi
进口乌维康
app=FastAPI()
@app.get(“/”,状态代码=200)
def index():
返回{'message':'Hello,World!'
@app.post(“/”,状态代码=201)
def index_post():
返回{'message':'Hello,Post!'
如果名称=“\uuuuu main\uuuuuuuu”:
乌维康(
“视图:应用程序”,
host=“localhost”,
端口=5000,
重新加载=真
)
继续并将该文件命名为views.py
创建您的虚拟环境(venv):
python3-m-venv-venv
来源
source-venv/bin/activate
安装模块
pip安装uvicorn fastapi
然后运行它
python views.py
现在您可以使用ngrok访问它
ngrok http 5000
当您在views.py
中保存更改时,您的uvicorn服务器将自动重新启动,您应该能够在不重新启动任何东西的情况下尝试更改
希望这能让你走起来。你就快到了。您正在使用的注释
@app.route("/")
使用GET
方法创建默认路由,但您正在尝试POST
。由于您没有定义POST
,因此得到了一个405方法,该方法是不允许的
。要解决这个问题,只需定义POST
,如文档所示
另外,您还可以使用pyngrok
在Python脚本中管理ngrok
。有一个烧瓶文档化的示例,但如果是简短的示例,您只需从pyngrok导入ngrok和ngrok.connect(5000)执行。Boom,现在您有了到Flask dev服务器的隧道
@app.route('/', methods=['GET', 'POST'])