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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Bottle

Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。

Python 3.x

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

Q&A

解決済

1回答

581閲覧

bottleのlocalhostが、ブラウザ以外からリクエストを投げても反応しない

退会済みユーザー

退会済みユーザー

総合スコア0

Bottle

Bottleは、PythonのWebサーバです。1つのPythonファイルで構成されており、非常に軽量。Web APIの作成や導入が簡単で、DjangoやFlaskに比べ使いやすくシンプルなことが特徴です。

Python 3.x

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

0グッド

1クリップ

投稿2019/07/13 10:27

前提

bottlelocalhostを立てて処理をおこなっています。
ブラウザからアクセスした場合には、全く問題無く動作しています。

ただ、別プロセスからlocalhostを操作するニーズがあり、localhostに対してrequestを投げて操作したいと思っています。
そこで以下のようなコードを試しました。

python

1@route('/test',method=["GET"]) 2def test_response(): 3 return "alive" 4bottle.run(host='localhost', port=8001) 5# bottle.run(host='0.0.0.0', port=8001)も試したが同じ

python

1import requests 2url = "http://localhost:8001/test" 3rslt = requests.get(url) 4print(rslt)

現象

サーバーからいつまでたってもレスポンスがかえってきません。
ばらつきがあるのですが、以下のことが確認できました。

  • 普通にリクエストを投げると、数分待ってもレスポンスがない。

  • ↑のレスポンス待ちの状態で、ブラウザからlocalhostに対して何らかの操作をおこなうと、すぐさまレスポンスがある(別プロセスへのレスポンスがすぐにおこなわれ、ブラウザでおこなったリクエストにも続けざまにレスポンスがある。)

  • ↑の方法などで一旦レスポンスを得ると、別プロセスからのリクエストも、レスポンスがなされるようになる。

  • 「サーバーは、リクエストが複数来たときに反応する」という仮説に基づいて、複数のスレッドから5リクエストほど続けて投げてみたが、反応なし(ブラウザからリクエストしないと駄目)

  • postmanからも同様のリクエストを送ってみたが、同様の結果。

ブラウザからは全く問題なく動いており、どこに問題があるのか分かりません。
どのように対処したらよいのでしょうか。
なお、bottle.run(host='0.0.0.0', port=8001) としてみても結果は同じでした。

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

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

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

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

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

mistn

2019/07/13 14:24

windows10,python 3.7.3,bottle 0.12.13の環境で試してみましたがきちんとレスポンスがありました。少なくともプログラムに問題はないようです。 結果が変わるかわかりませんがbottleではなくflaskで実装してみてはどうですか?
退会済みユーザー

退会済みユーザー

2019/07/14 02:41

ありがとうございます。いまflaskで試したところ、さっくりと動きました。 bottleで既にかなりたくさん書いてしまっているため、ちょっと悩んでいます。(しかしインターフェースはそんなに変わらないのでしょうか。もう少し考えてみます。)
退会済みユーザー

退会済みユーザー

2019/07/14 02:56

すみません、上記『だけ』のbottleのコードだとレスポンスがありました(初歩的な実験が漏れていました。すみません。) 実際のソースはもっと多いのですが、ただ、  @route('/test',method=["GET"]) def test_response(): return "alive" という部分(とrunの方法)はそのままです。 コードのどこかが影響しているということになると思うのですが、bottleの挙動を変更しているような箇所は特に思い当たらず、全然見当が付きません。。 こういう、なぜかレスポンスしない、という事象に想定される原因ってあるのでしょうか。
mistn

2019/07/14 03:20

ソースコードを見ないことにはなんとも言えませんが今の段階では私も見当がつかないですね。 部分的にコメントアウトしていって試していくしかないのではないでしょうか。
guest

回答1

0

ベストアンサー

おそらく解決しました。

確認できた法則

  • bottleを使用しているとき
  • webbrowserからlocalhostにアクセスすると
  • それ以降、browser以外から投げたリクエストが保留される (browserからリクエストすると、browser以外からのリクエストに一緒にレスポンスがある)

以上のようなことでした。
ブラウザはchrome edge で確認しました。リクエストはpostmanで投げました(今回試していませんが、以前はrequestsなどでも同じ結果)。

正直、理屈が理解できないのですが、現象としては以上のようになっています。

今のところ、flaskでは上記の現象は起きていません。
ともかく、flaskを使用するということで迂回したいと思います。

幸いインターフェースはかなり似ているので、移行は難しくありません。

投稿2019/09/28 06:46

編集2019/09/28 06:48
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問