尝试从 Internet 访问我的 Python Flask 网络服务时,我到达了服务器,但是如果我使用 127.0.0.1,它会返回 404 它可以工作但不是实际 IP

问题描述

问题: 尝试从 Internet 访问我的网络服务,呼叫到达服务但服务返回 404,即使我在使用 127.0.0.1:5000 时尝试本地 IP 地址同样的问题,它也能工作

from flask import Flask,jsonify

app = Flask(__name__)
courses= [{'name':"Dirty Corporate Dairy",'course_id': "0",'Description': "Story about ",'Price':"120"},{'name': "Dirty Corporate Dairy 2",'course_id': "1",'Price':"1200"},{'name': "Dirty Corporate Dairy3",'course_id': "2",'Price':"12000"}
          ]


if __name__ == '__main__':
    from waitress import serve
    app.run(host='192.168.0.113',debug=True,port=80)

@app.route('/')
def index():
    return "Welcome To the Course API"

@app.route("/courses",methods=['Get'])
def get():
    return jsonify({'Courses': courses})

@app.route("/courses/<int:course_id>",methods=['Get'])
def get_course(course_id):
    return jsonify({'Courses': courses[course_id]})

@app.route("/courses",methods=['Post'])
def create():
    course={'name': "Dirty Corporate Dairy7",'course_id': "6",'Description': "Story about",'Price':"120000000"}
    courses.append(course)
    return jsonify({'Created': course})

@app.route("/courses/<int:course_id>",methods=['Put'])
def update(course_id):
    courses[course_id]["Description"] = "New Updated Description"
    return jsonify({'Courses': courses[course_id]})

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

日志:

  • 服务 Flask 应用“主”(延迟加载)

  • 环境:生产 警告:这是一个开发服务器。不要在生产部署中使用它。 改用生产 Wsgi 服务器。

  • 调试模式:开启

  • 使用 stat 重新启动

  • 调试器处于活动状态!

  • 调试器 PIN:186-690-898

  • http://192.168.0.113:80/ 上运行(按 CTRL+C 退出

    192.168.0.113 - - [05/Apr/2021 18:44:32] "←[33mGET / HTTP/1.1←[0m" 404 - 192.168.0.113 - - [05/Apr/2021 18:44:40] "←[33mGET / HTTP/1.1←[0m" 404 - 157.48.141.253 - - [05/Apr/2021 18:47:41] "←[33mGET /courses HTTP/1.1←[0m" 404 -

解决方法

默认情况下,出于安全目的,Flask 仅侦听来自本地源 (127.0.0.1) 的请求(这是一项安全功能)。要使服务从其他 ip 可用,您需要使用 --host 选项 like here 公开它。

,
  1. 192.168.0.113 是您本地(家庭)网络上的 IP 地址(请参阅此 documentation),默认情况下您的家庭网络无法访问互联网。这意味着您的程序只能在您的家庭网络中访问。家庭网络之外的人无法访问它。
  2. 为了能够通过互联网访问您的程序,您需要一项服务,该服务本质上将“将此本地 ip”放在网络上,即可以为您的机器提供隧道的服务。执行此操作并被广泛使用的一项服务是 https://ngrok.io。基本上,该服务将为您提供一个映射到您本地 ip 的公共 ip