【问题标题】:How to make post requests work with ngrok?如何使发布请求与 ngrok 一起使用?
【发布时间】:2023-04-21 20:59:02
【问题描述】:

我正在使用 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 请求起作用?

【问题讨论】:

    标签: python flask post request ngrok


    【解决方案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 开发服务器的隧道了。

        【讨论】: