1

我正在开发一个实时聊天和照片共享应用程序。我使用 Flask 作为我的服务器端来构建 RESTful Web 服务,并使用 Ionic 框架 (AngularJS) 在移动设备上构建我的客户端。

我有一个 Web 服务端点 [GET] /feeds/user_id 返回用户的新提要。当我使用以下代码行初始化我的应用程序时,我可以正确地从 localhost 和我在移动设备上运行的应用程序检索数据。

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

当我使用实时聊天构建应用程序时,我使用 Flask-SocketIO 并将我的应用程序的初始化方式更改为以下方式,如官方文档中所述。

socketio.run(app, host='0.0.0.0', policy_server=False)

但是,我现在无法通过上述初始化方式从我的移动应用程序中检索数据。示例日志之一是:

192.168.1.100 - - [2015-09-13 23:38:32] "GET http://192.168.1.101:5000/feeds/1 HTTP/1.1" 404 342 0.002000

但是,我可以使用相同的链接从我的本地主机和同一网络中的另一台机器检索数据,因此我确信服务器正在侦听所有公共 IP。我也禁用了我的防火墙。

我的代码片段如下:

from app import socketio, app
if __name__ == '__main__':
    socketio.run(app, host='0.0.0.0', policy_server=False)
    # app.run(host='0.0.0.0', debug=True)

任何帮助表示赞赏!

更新:当我只使用 app.run() 时,日志如下:

192.168.1.110 - - [20/Sep/2015 00:17:23] "GET http://192.168.1.103:5000/feeds/1 HTTP/1.1" 200 -

正如 Miguel 所提到的,这是一个奇怪的日志,但它可以工作,所以感谢 Flask 的健壮性!

我还尝试在 iOS 上运行我的应用程序,效果很好。现在我怀疑这是 Android 平台上的 Ionic 框架的问题,或者只是在我的设备上。我的设备是 Nexus 7 Gen 1,运行 Android 5.1.1。

4

1 回答 1

1

我自己解决了我的问题。

Flask 和 Flask-SocketIO 启动的服务器类型不同——Flask 启动标准的 Werkzeug 开发 web 服务器,但 Flask-SocketIO 启动 gevent web 服务器。这就是为什么我看到我在问题中提到的不同行为,但问题不在于 Flask。

真正的问题在于内置的 WebView 如何处理对服务器端的 HTTP 请求。在我的设备中,WebView 似乎以一种奇怪的方式处理请求 - 我没有详细研究这一点。因此,gevent Web 服务器无法处理此 HTTP 请求 - 导致 404。

我解决这个问题的方法是将最新 Chrome 版本的 WebView 打包到我的应用程序中。我使用人行横道来做到这一点。它完美地解决了我的问题。

于 2015-09-24T14:48:41.523 回答