【问题标题】:Flask Python - Put request returns only 404 after changing host to 0.0.0.0Flask Python - 将主机更改为 0.0.0.0 后,Put 请求仅返回 404
【发布时间】:2015-11-01 07:27:19
【问题描述】:

在将 .py 脚本设置为 app.run(host='0.0.0.0') 之后,我所有的 put/get/etc 请求都以 404 结束。

E:\location>c:Python27\python.exe coordinatorSim.py
* 在http://0.0.0.0:5000/ 上运行(按 CTRL+C 退出)
192.168.0.101 - - [01/Nov/2015 09:19:18] “PUT /patient/start HTTP/1.1”404 -

我从wifi网络中的另一台机器向192.168.0.103:5000/patient/start发送请求,这是运行py脚本的机器的ip。

如果我删除了app.run(host='0.0.0.0'),那么请求会在默认本地主机地址127.0.0.1:5000 上工作(假设我将请求发送到127.0.0.103:5000/patient/start

我错过了什么?

put 请求是:

app = Flask(__name__)
app.debug = True
app.run(host='0.0.0.0')
sSocket = None
......
    # Creates client for socket communication. The http client supplies the IP address and port no.
@app.route('/patient/start', methods = ['PUT'])
#@requires_auth
def patient_start():
    global sThreadStarted
    global sSocket
    global sSocketThread
    # If the client is already started, return an error code !?
    #print "JSON:", request.json

    if len(request.json) > 0:

        l_address = request.json["address"]
        l_port = request.json["port"]
        # Start client
        print l_address, l_port
        try:

            sSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        except socket.error, e:
            return "Error creating socket: " + e
        try:

            sSocket.connect((l_address, int(l_port)))
        except socket.gaierror, e:
            return "Address error: " + e
        except socket.error, e:
            return "Connection error: " + e

        try:
            sThreadStarted = True
            sSocketThread.start()
        except threading.ThreadError, e:
            return "Threading error: " + e

        message = {
                'status': 200,
                'message': 'Socket created'
            }
        resp = jsonify(message)
        resp.status_code = 200

        return resp
    else:
        return bad_request()

【问题讨论】:

  • 如果没有DEBUGdisabled,我认为你无法在 0.0.0.0 上运行
  • @jvc26 实际上 never0.0.0.0 上运行 debug 模式是个好主意,但我认为这不是问题。
  • 嘿,确实是的 - 我实际上并不认为 Flask 让你,但你是对的,那太愚蠢了!
  • 只是设置了app.debug = True,结果没有变化
  • 那里的bad_request 是什么?还要检查 localhost:5000 甚至应用程序从 0.0.0.0 开始

标签: python rest network-programming python-requests


【解决方案1】:

我在 Amazon EC2 上托管我的 Flask React 应用程序时遇到了这个问题。我花了几个小时来解决这个问题。

解决方法是在 Flask App 的 settings.py 文件中设置SERVER_NAME = None

感谢Ronhanson 他对Github 的评论。

只是重申一下:

  1. 在 EC2 安全组入站规则中打开端口 5000
  2. 在 manage.py 中添加行 app.run(host='0.0.0.0')
  3. 在settings.py中更新SERVER_NAME = None

按照上述步骤,您的应用将可以从外部网络访问。

【讨论】:

    【解决方案2】:

    我还遇到了无法在本地网络中运行我的应用程序的问题。我的网络浏览器中的错误消息是

    未找到 在服务器上未找到请求的 URL。如果你 手动输入网址,请检查您的拼写并重试。

    在我的终端日志中它说

    “GET / HTTP/1.1”404 -

    所以 -> 它找不到任何东西,为什么:

    问题是您使用 app.run 运行您的应用程序,它不是 var,所以: 首先,您必须进行导入、构建和配置您的应用程序。然后你可以启动你的网络服务器,它在你的本地机器上运行你的应用程序,就像在你的

     __init__.py
    

    app.run(host= '0.0.0.0', debug=True)

    或者直接在你的网络应用结束时喜欢这个

    if __name__ == '__main__':
        app.run(host='0.0.0.0', debug=True)
    

    【讨论】:

      【解决方案3】:

      当我在一个小的 Raspberry Pi 脚本中遇到这个问题时,我发现脚本顶部的“app.run(host='0.0.0.0')”是个问题。

      我现在使用这样的构造:

      from flask import Flask, jsonify, abort, make_response
      ...
      app = Flask(__name__)
      @app.route('/')
      def index():
          return "Yadda yadda yadda!"
      
      @app.route('/properties', methods=['GET'])
      def get_properties():
          return jsonify({'site': site})
      ...
      
      if __name__ == '__main__':
          app.run(host='0.0.0.0', debug=True)
      

      “debug=True”在这种情况下可以正常工作,来自远程客户端的 GET 和 PUT 也是如此。文档不鼓励在侦听所有地址时使用 debug=True,但并不禁止它(“如果您已禁用调试或信任您网络上的用户.. .",强调我的)。

      【讨论】:

        【解决方案4】:

        来自文档

        默认情况下,路由只响应 GET 请求,但可以通过将方法参数提供给 route() 装饰器来更改

        所以你必须设置

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

        【讨论】:

        • 我的脚本中确实有 @app.route('/patient/start', methods = ['PUT']),但结果仍然是 404..
        • 仅在 0.0.0.0 中运行时为 404?
        • 是的。在0.0.0.0 上,请求从我的 android 手机发送到192.168.0.103:5000/patient/start,它的 ip 为 192.168.0.101
        • 请发布您的代码(该路线),以便我们可以找到那里是否有装饰器或其他东西。
        • 那里的 bad_request 是什么?还要检查 localhost:5000 甚至应用程序从 0.0.0.0 开始
        猜你喜欢
        • 1970-01-01
        • 2023-02-16
        • 2021-12-25
        • 2020-03-16
        • 2023-02-24
        • 1970-01-01
        • 2017-03-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多