質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1815閲覧

Pythonのrequestsでlocalhostにアクセスすると403エラーになってしまう

knov

総合スコア1

docker-compose

docker-composeとは、複数のコンテナで構成されるサービスを提供する手順を自動的し管理を簡単にするツール。composeファイルを使用しコマンド1回で設定した全サービスを作成・起動することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Docker

Dockerは、Docker社が開発したオープンソースのコンテナー管理ソフトウェアの1つです

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2024/01/05 08:35

編集2024/01/05 08:37

実現したいこと

お世話になります。
DockerでVoicevoxのサーバーを立ち上げており、そのサーバーにリクエストを投げた時に200番のレスポンスが返るようにしたいです。
よろしくお願いいたします。

発生している問題・分からないこと

requestsのURLにlocalhostを指定すると403エラーになってしまいます。

エラーメッセージ

error

1HTTP error occurred: 403 Client Error: Forbidden for url: http://localhost:50021/speakers

該当のソースコード

Python

1import requests 2from requests.exceptions import HTTPError 3 4try: 5 response = requests.get("http://localhost:50021/speakers") 6 # response = requests.get("https://www.google.com/") この場合は正常に動作 7 # 正常な応答を得られた場合、ステータスコードが200台であることを確認 8 response.raise_for_status() 9except HTTPError as http_err: 10 # HTTPエラー発生時(例:404, 403, 500等)の処理 11 print(f'HTTP error occurred: {http_err}') 12except Exception as err: 13 # その他のエラー発生時の処理 14 print(f'Other error occurred: {err}') 15else: 16 # エラーが発生しなかった場合の処理 17 print('Success!')

docker

1version: "3" 2services: 3 voicevox: 4 image: voicevox/voicevox_engine:cpu-ubuntu20.04-latest 5 ports: 6 - "50021:50021" 7 tty: true

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

試したこと

  • 別のPCで行ったところ正常に動作
  • ブラウザやPostmanからであれば正常に動作
  • 同じ型の別のPCで友人に試してもらったところ正常に動作
  • localhostではなく、googleのURLを入れて実行したら正常に動作
  • localhostを127.0.0.1に変更し実行したが403エラーが表示される
  • PCの再起動を行っても403エラーが表示される
  • Docker Desktopを再起動しても403エラーが表示される
  • コンテナを削除し、docker-compose up -dを再度実行しても403エラーが表示される
  • Pythonをアンインストール後、再度インストールしても403エラーが表示される
  • PCやアプリのアップデートを全て行っても403エラーが表示される

補足

関係あるかは分かりませんが、コンテナを停止させても403エラーが表示されました。
Pythonのコードを実行後、Dockerのログには何も表示されませんでした。(ブラウザやPostmanからアクセスした際にはログが表示されていました。)

使用したバージョンは以下の通りです。
python==3.11.4 (python==3.10も使用して試してみました。)
requests==2.31.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yutoml

2024/01/07 22:49

自分のほう(Windows11)でも一通りためしてみましたが正しく動きますね ただコンテナを停止したときにpythonのコードを走らせると ``` Other error occurred: HTTPConnectionPool(host='localhost', port=50021): Max retries exceeded with url: /speakers (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000021C351FD300>: Failed to establish a new connection: [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。')) ``` となるためコンテナが止まった時でも403が出てくるのがおかしい気がします。 50021ポートで何か別のサービスが走っているということはないでしょうか?
knov

2024/01/08 11:56

コメントありがとうございます。以下を試しましたがまだ解決できていません。 以下の他に確認する方法があれば教えて頂きたいです。よろしくお願いいたします。 試したこと ・ポート番号を5021:50021に変え、再度実行(requestsのURLも併せて変更)→403エラー ・コンテナをすべて停止させ再度実行→403エラー ・Dokcer Desktop自体を閉じ、再度実行→403エラー
yutoml

2024/01/10 04:10

すみませんきちんとブラウザやPostmanからは見れると書いてありますね。 つまりpythonのrequestにのみ発生する問題ということでしょうか?ブラウザからのアクセスというのはhttp://localhost:50021/speakersということですか? おそらく私自身では力になれないと思いますが、以下の内容について気になります。 1. 実行環境(自分の手元のPCなのか何かクラウドサーバなどを使っているのか) 2. なにが403を返しているのか 2.1 netstatなどで確認できる? 2.2 リバースプロキシが間にはさまっていて設定を間違えてlocalhostからのアクセスを拒絶している?(ただしブラウザから見れることと矛盾)
knov

2024/01/12 09:11 編集

> つまりpythonのrequestにのみ発生する問題ということでしょうか?ブラウザからのアクセスというのはhttp://localhost:50021/speakersということですか? はい、その通りです。 ありがとうございます。おかげで解決することが出来ました。 原因としては、プロキシの設定が原因だったようです。 以下の方法 (どちらか片方) で解決することが出来ました。 プロキシサーバーを編集 (設定 > ネットワークとインターネット > プロキシ > プロキシサーバーを使う) - 「次のエントリで始まるアドレス以外にプロキシサーバーを使います。」の欄に`<local>`を入れる - 「ローカル (イントラネット) のアドレスにはプロキシサーバーを使わない」にチェックを入れる 上記の設定をしていなくてもブラウザやPostmanからは正常にアクセス出来るようなので、自動的に設定されているのかもしれないと思い、調べてみた結果は以下の通りです。 - Chromeに関しては、localhostの場合proxyは通らないようです。(以下の記事を参考にさせていただきました。) https://qiita.com/msakamoto_sf/items/7a7be506977d70a74446 - Postmanに関しては、システムで設定したプロキシを使用するみたいです。(であれば、Postmanではrequestsと同様に値が返ってこないのではと思いますが。。。) (以下の記事を参考にさせていただきました。) https://learning.postman.com/docs/getting-started/installation/proxy/ Postmanの上記の挙動について何かご存じの方がいらっしゃいましたら教えて頂きたいです。
knov

2024/01/12 01:39

yutoml様 コメントありがとうございました。 ベストアンサーに選びたいので同じ内容を回答欄に投稿いただけますでしょうか?
yutoml

2024/01/13 14:19

解決できたようで何よりです。また微妙にずれたコメントをしていたにもかかわらず、上記のように言っていただけて恐縮です。ご配慮ありがとうございます。
guest

回答1

0

ベストアンサー

(以下の内容は質問へのコメントで行われたやり取りをまとめたものです。またknovさん、ご配慮ありがとうございます。)
最終的な解決法は末尾にあります。

私が施行した結果

まず質問者さんが提供してくださったdocker-composeを利用して、voicevoxを立てたのち、質問者さんのpythonコードを走らせたところ私の環境では正常に動作しました。
その後、コンテナを停止させ、再度pythonコードを走らせると以下の出力を得ました。

bash

1Other error occurred: HTTPConnectionPool(host='localhost', port=50021): Max retries exceeded with url: /speakers (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x0000021C351FD300>: Failed to establish a new connection: [WinError 10061] 対象のコンピューターによって拒否されたため、接続できませんでした。'))

私のpcではレスポンスを返すもの存在しないので上記の結果になりますが、質問者さんではこの段階で403が帰ってきています。

考えられる原因

403が帰ってきている以上何かがレスポンスを返しています。
したがって私が考えられる原因は以下の通りでした。

  • 何らかのサービスがいる(その場合ポートの衝突が起こるのでそもそもコンテナが動かないはず)
  • プロキシか何かが間にいる

結果的な解決法

詳細は質問へのコメントを参照していただきたいですが、プロキシサーバを利用していたことが原因のようです。
質問者さんによるとプロキシを経由する宛先の例外にlocalを加えることで解決に至ったようです。

投稿2024/01/13 14:15

yutoml

総合スコア9

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問