问题描述
问题: 尝试从 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 应用“主”(延迟加载)
-
调试模式:开启
-
使用 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 公开它。
- 192.168.0.113 是您本地(家庭)网络上的 IP 地址(请参阅此 documentation),默认情况下您的家庭网络无法访问互联网。这意味着您的程序只能在您的家庭网络中访问。家庭网络之外的人无法访问它。
- 为了能够通过互联网访问您的程序,您需要一项服务,该服务本质上将“将此本地 ip”放在网络上,即可以为您的机器提供隧道的服务。执行此操作并被广泛使用的一项服务是 https://ngrok.io。基本上,该服务将为您提供一个映射到您本地 ip 的公共 ip