Flask開発サーバーをネットワーク全体から見えるように構成する


442

これがFlask固有のものかどうかはわかりませんが、開発モード(http://localhost:5000)でアプリを実行すると、ネットワーク上の他のマシンから(を使用してhttp://[dev-host-ip]:5000)アクセスできません。たとえば、Railsが開発モードの場合、問題なく機能します。Flask開発サーバーの構成に関するドキュメントが見つかりませんでした。これを有効にするために何を設定すればよいですか?

回答:


712

これは可能ですが、本番環境ではFlask開発サーバーを使用しないでください。Flask開発サーバーは、特に安全、安定、または効率的であるように設計されていません。正しいソリューションについては、デプロイに関するドキュメントをご覧ください。


パラメータをに追加しますapp.run()。デフォルトではlocalhostでapp.run(host= '0.0.0.0')実行されますが、マシンのIPアドレスで実行されるように変更します。

クイックスタートページの「Externally Visible Server」の下のFlaskサイトに文書化されています

外部から見えるサーバー

サーバーを実行すると、サーバーは自分のコンピューターからのみ利用でき、ネットワーク内の他のコンピューターからは利用できないことがわかります。デバッグモードでは、アプリケーションのユーザーがコンピューター上で任意のPythonコードを実行できるため、これがデフォルトです。デバッグを無効にしている場合、またはネットワーク上のユーザーを信頼している場合は、サーバーを公開することができます。

run()メソッドの呼び出しを次のように変更するだけです。

app.run(host='0.0.0.0')

これは、オペレーティングシステムにパブリックIPでリッスンするように指示します。


44
特定のip app.run(host = "192.168.1.7"、port = 5010)に設定するには、PCにいくつかのIPがある場合に便利です
lxx

2
私のサーバーでホストしているフラスコスクリプトにグローバルにアクセスする方法
pyd

このソリューションは、Dockerコンテナーでも機能します。この投稿では、これらのケースのソリューションについて説明します。

Macの場合:システム環境設定>共有で指定されたドメインをターゲットにすることを除いて、0.0.0.0でフラスコアプリにアクセスできませんでした(そこで提供されていたとしても)。ドメインはのようになりますmymacname.local
Nico Cernek

14
どういうわけか私のMacでは、flask run --host 0.0.0.0それを機能させるために明示的に使用する必要があります。
MinhNghĩa19年

122

実行可能フラスコを使用してサーバーを起動する場合、を使用flask run --host=0.0.0.0してデフォルトを127.0.0.1から変更し、非ローカル接続で開くことができます。他の回答で説明されているconfigおよびapp.runメソッドは、おそらくより良い方法ですが、これも便利です。

外部から見えるサーバーサーバーを実行すると、サーバーには自分のコンピューターからのみアクセスでき、ネットワーク内の他のコンピューターからはアクセスできないことがわかります。デバッグモードでは、アプリケーションのユーザーがコンピューター上で任意のPythonコードを実行できるため、これがデフォルトです。

デバッガーを無効にするか、ネットワーク上のユーザーを信頼している場合は、コマンドラインに--host = 0.0.0.0を追加するだけでサーバーを公開できます。

Flask run --host = 0.0.0.0これは、オペレーティングシステムにすべてのパブリックIPをリッスンするように指示します。

リファレンス:http : //flask.pocoo.org/docs/0.11/quickstart/


2
他の誰かがそれを経験したかどうかはわかりませんが、QuickStartドキュメントに従って最初にこの方法を試しましたが、奇妙な理由でIPが実行され続けました127.0.0.1(Flask実行可能ファイルを適切に設定したか、そうではなかったようです)私が間違っていたことを確認してください)。しかし、app.run(host='0.0.0.0')別の回答で述べたようにサーバーファイルに追加した後、ネットワークを介してページにアクセスできました。他の誰かが私が説明したような問題を抱えているか、それについて何か情報がありますか?
twknab

2
私にとっては、フラスコ実行--host = 0.0.0.0は問題を解決します。url -http:// <ip address>:5000にアクセスできました。最初に、コマンド-sudo firewall-cmd --zone = public --list-portsを使用してマシン上で開いているポートを確認した後、ポート5000が開いていないことを知りました。このポートを開くには、コマンド-sudo firewall-cmd --zone = public --permanent --add-port = 5000 / tcpを使用し、その後にsudo firewall-cmd --reloadを使用します。次に、フラスコアプリを次のように実行します-フラスコ実行--host = 0.0.0.0
Pintu Kumar 2018

23

0.0.0.0メソッドが機能しない場合は、これを試してください

退屈なもの

ローカルサーバーを介して他のデバイス(ラップトップや携帯電話)からアプリにアクセスできるようにするために、個人的に何度も戦いました。0.0.0.0メソッドを試しましたが、うまくいきませんでした。その後、ポートを変更しようとしましたが、うまくいきませんでした。そこで、さまざまな組み合わせを試してみたところ、この組み合わせにたどり着き、ローカルサーバーにアプリをデプロイするという問題が解決しました。

手順

  1. コンピュータのローカルIPv4アドレスを取得します。これはipconfig、Windows、ifconfigLinux、Macで入力することで実行できます。

IPv4(Windows)

注:上記の手順は、アプリを提供しているマシンで実行するものであり、アプリにアクセスしているマシンでは実行しないでください。また、ネットワークを切断して再接続すると、IPv4アドレスが変更される可能性があります。

  1. 次に、取得したIPv4アドレスでフラスコアプリを実行します。

    flask run -h 192.168.X.X

    たとえば、私の場合(画像を参照)、次のように実行しました。

    flask run -h 192.168.1.100

フラスコアプリを実行する

私のモバイルデバイスで

私の携帯電話からのスクリーンショット

オプションのもの

Windowsでこの手順を実行していて、Power ShellをCLIとして使用していてもWebサイトにアクセスできない場合は、アプリを実行しているシェルでCTRL + Cコマンドを試してください。Power Shellがフリーズすることがあり、復活するにはピンチが必要です。これを行うとサーバーが終了する場合もありますが、場合によってはうまくいきます。

それでおしまい。これが役に立ったと思ったら、高く評価してください。😉

さらにオプションのもの

必要なときにIPアドレスを取得する短いPowerShellスクリプトを作成しました。

$env:getIp = ipconfig
if ($env:getIp -match '(IPv4[\sa-zA-Z.]+:\s[0-9.]+)') {
    if ($matches[1] -match '([^a-z\s][\d]+[.\d]+)'){
        $ipv4 = $matches[1]
    }
}
echo $ipv4

拡張子が.ps1のファイルに保存し(PowerShellの場合)、アプリを起動する前に実行します。プロジェクトフォルダーに保存して、次のように実行できます。

.\getIP.ps1; flask run -h $ipv4

注:上記のシェルコードをgetIP.ps1に保存しました。

かっこいい👌


1
うん!できます。ipv4 ipをフラスコに設定することにより、携帯電話でそれを取得できません。うまくいけば、他の人にも役立ちます:)
Ashu Kumar

@nwilloはモバイルを実行し、私がサービスを提供するマシンは同じwifi /ネットワークに接続されます。
sachin rathod

@sachinrathodはい。彼らはしないといけない。これにより、同じIPゲートウェイにアクセスできます。
nwillo

22

cool次の例のように、アプリに設定が外部ファイルから読み込まれている場合は、対応する設定ファイルをHOST = "0.0.0.0"に更新することを忘れないでください

cool.app.run(
    host=cool.app.config.get("HOST", "localhost"),
    port=cool.app.config.get("PORT", 9000)
)            

1
これは、フラスコ構成にホスト名とポート番号を格納するための良い方法です。私はまさにこの解決策を探していました。
2015年

20

以下の行をプロジェクトに追加します

if __name__ == '__main__':
    app.debug = True
    app.run(host = '0.0.0.0',port=5005)

取得中OSError: [WinError 10013] An attempt was made to access a socket in a way forbidden by its access permissions
pyd

修正する方法へ 管理者として実行してPythonファイルを実行し、Windowsで実行されているポートを確認する必要がありますnetstat -na|findstr 5005
Jeevan Chaitanya、2018

10

クライアントにサービスを提供するためにサーバーで特定のポートが開いているかどうかを確認しますか?

UbuntuまたはLinuxディストリビューション

sudo ufw enable
sudo ufw allow 5000/tcp //allow the server to handle the request on port 5000

リモート要求を処理するようにアプリケーションを構成する

app.run(host='0.0.0.0' , port=5000)


python3 app.py & #run application in background

5

CMD(コマンドプロンプト)でプロジェクトパスに移動し、次のコマンドを実行します。

FLASK_APP = ABC.pyを設定します

SET FLASK_ENV = development

フラスコ実行-h [yourIP] -p 8080

あなたはCMDで次のo / pを取得します:-

  • Flaskアプリ「expirement.py」の提供(遅延読み込み)
    • 環境:開発
    • デバッグモード:オン
    • statで再起動する
    • デバッガがアクティブです!
    • デバッガーPIN:199-519-700
    • 上で実行されているのhttp:// [yourIP]:8080 /(Ctrlキーを押しながらCを終了します)

これで、http:// [yourIP]:8080 / url を使用して別のマシンのフラスコアプリにアクセスできます


4

PyCharmを使用してデプロイされたFlaskサーバーへのアクセスに問題がある場合は、以下を考慮してください。

PyCharmはメインの.pyファイルを直接実行しないので、のコードはif __name__ == '__main__':実行されず、変更(などapp.run(host='0.0.0.0', port=5000))は有効になりません。

代わりに、実行構成を使用して、特に[ 追加オプション]フィールドに配置--host 0.0.0.0 --port 5000して、Flaskサーバーを構成する必要があります。

FlaskサーバーPyCharmの構成を実行する

PyCharmでのFlaskサーバーの設定の詳細


これは実際にすべての私の問題を解決し、この質問に対する正しい答えになるはずです!
アルベルト・ベリーニ

3

同じ問題がありました。PyCharmをエディターとして使用し、プロジェクトを作成したときにPyCharmがFlaskサーバーを作成しました。私がしたことは、次の方法でPythonを使用してサーバーを作成することでした。

PythonサーバーPyCharmの構成 基本的に私がしたことは新しいサーバーを作成することでしたが、Pythonではない場合はフラスコでした

お役に立てば幸いです


画像を投稿するだけでなく、問題を解決するために何をすべきかを具体的に説明してください。
特定のパフォーマンス2018

もちろん、回答を改善するためにすでに投稿を編集している場合は。
Juanes30 2018

3

この回答はフラスコだけに関連しているわけではありませんが、別のホストの問題から接続できないすべてのサービスに適用できます。

  1. netstat -ano | grep <port>アドレスが0.0.0.0または::かどうかを確認するために使用します。127.0.0.1の場合は、ローカルリクエスト専用です。
  2. tcpdumpを使用して、欠落しているパケットがないか確認します。明らかな不均衡が見られる場合は、iptablesでルーティングルールを確認してください。

今日はいつものようにフラスコアプリを実行していますが、他のサーバーから接続できないことに気付きました。次に、を実行するnetstat -ano | grep <port>と、ローカルアドレスは::またはです0.0.0.0(両方を試しましたが、127.0.0.1はローカルホストからの接続のみを許可していることを知っています)。それから私が使用したtelnet host port、結果はのようなものconnect to ...です。これは非常に奇妙です。次に、で確認した方がいいと思いましたtcpdump -i any port <port> -w w.pcap。そして、私はそれがすべてこのようなものであることに気づきました:

tcpdumpの結果は、リモートホストからのSYNパケットのみがあることを示しています

次に、iptables --listOUTPUTセクションをチェックすると、いくつかのルールを確認できます。

iptablesリストの結果

これらのルールは、ハンドシェイクでの出力tcpバイタルパケットを禁止します。それらを削除することで、問題はなくなります。


3

私にとっては、上記の答えに従って少し修正しました:

  1. コマンドプロンプトでipconfigを使用してipv4アドレスを取得するだけです
  2. フラスココードが存在するファイルに移動します
  3. メイン関数でapp.run(host = 'your ipv4 address')と書き込みます

例えば:

ここに画像の説明を入力してください


1

プロジェクトパスに移動しますset FLASK_APP = ABC.py SET FLASK_ENV = development

フラスコ実行-h [yourIP] -p 8080 CMDでo / pに従います:-* Flaskアプリ "expirement.py"(遅延読み込み)を提供します*環境:開発*デバッグモード:オン* statで再起動*デバッガーがアクティブです!*デバッガーPIN:199-519-700 * http:// [yourIP]:8080 /で実行(終了するにはCTRL + Cを押します)


1

また、環境変数を介してホスト(ネットワークに面したIPアドレスで公開するため)およびポートを設定することもできます。

$ export FLASK_APP=app.py
$ export FLASK_ENV=development
$ export FLASK_RUN_PORT=8000
$ export FLASK_RUN_HOST=0.0.0.0

$ flask run
 * Serving Flask app "app.py" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on https://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 329-665-000

環境変数を設定するために使用可能なすべてのコマンドオプションを取得する方法を参照してください


1

.flaskenvプロジェクトのルートディレクトリにファイルを作成します。

このファイルのパラメーターは通常、次のとおりです。

FLASK_APP=app.py
FLASK_ENV=development
FLASK_RUN_HOST=[dev-host-ip]
FLASK_RUN_PORT=5000

仮想環境がある場合は、それをアクティブにしてを実行しpip install python-dotenvます。

このパッケージは.flaskenvファイルを使用し、その中の宣言はターミナルセッション全体で自動的にインポートされます。

その後、行うことができます flask run

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.