【Mac Monterey】Flaskのデフォルトポート5000で接続エラー

macOSの最新版Montereyにて、Flaskのデフォルトポートを使うと接続できない問題がありましたので報告します。

問題の現象

以下のようなFlaskアプリケーションを起動してブラウザからアクセスすると、403エラーで失敗します。

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return('Hello!')

app.run()

具体的には、以下のようになります。

  • 失敗 http://localhost:5000
  • 成功 http://127.0.0.1:5000

失敗時のHTTPレスポンス内容は以下です。

HTTP/1.1 403 Forbidden
Content-Length: 0
Server: AirTunes/600.8.1

失敗時の画面(Webインスペクタを表示)は、以下のようになります。

失敗時の画面

不思議です。。

環境は以下となります。

環境

  • OS macOS Monterey バージョン12.1
  • Python バージョン3.9.9
  • Flask バージョン2.0.2

原因・解決方法

まず、pingを確認しますが問題なし。

% ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.057 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.123 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.096 ms

次に、hostsを確認します。

% cat /private/etc/hosts
##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
255.255.255.255	broadcasthost
::1             localhost

”::1”でlocalhostが定義されていますが、これはIPv6のローカルループバックの書き方のようです。

いろいろググってみると、情報がありました。

https://developer.apple.com/forums/thread/693768

AirPlayがポート5000番を使っているようですね。。

https://developer.apple.com/forums/thread/682332

対策は、以下のようにアプリケーションにてポート番号を指定するか、

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return('Hello!')

app.run(port=8888)

以下のようにhostsに別名でエントリーを追加するかの2択になるように思います。

127.0.0.1	localhost1

まとめ

今回は、macOSの最新版Monterey固有の問題でした。
BigSurではこのような問題はありませんでした。

それにしても、Appleもこんな若いポートを使うなんて。。と思ったりします。

コメントを残す

メールアドレスが公開されることはありません。

18 − one =