【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もこんな若いポートを使うなんて。。と思ったりします。
コメント
コメント一覧 (1件)
同じ現象で困っていたので助かりました。ありがとうございます。