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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

Q&A

解決済

1回答

580閲覧

python-bottleでエラー500がでる

退会済みユーザー

退会済みユーザー

総合スコア0

Bottle

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Python

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

IoT

IoT(Internet of Things)とは、インターネットがコンピュータなどの情報・通信機器のネットワークだけでなく、世の中のある様々なモノに接続されて自動認識・自動制御・遠隔計測などの能力を備えることです。「モノのインターネット」と一般的にいわれます。

0グッド

0クリップ

投稿2019/08/29 07:22

スマートフォンでLEDを光らすor消すがしたい

ラズベリーパイゼロWを用いてiotしたいので、簡単にできるツールを探した結果bottleにたどりつき、HelloWorldはできました。
しかし、JavaScriptの実装やボタンの配置などをしようとコードを書いて表示させようとしたときに以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

n 127.0.0.1 - - [29/Aug/2019 15:46:08] "GET / HTTP/1.1" 200 291 favicon.ico Traceback (most recenr call last): File "/usr/lib/python2.7/dist-packages/bottle.py", line 862, in _handle return route.call(**args) File "/usr/lib/python2.7/dist-packages/bottle.py", line 1740, in wrapper rv = callback(*a, **ka) File "/home/pi/Documents/controlLED_on_web.py", line 37, in index led_num = int(led) ValueError: invalid literal for int() with base 19: 'favicon.ico' 127.0.0.1 - - [29/Aug/2019 15:46:12] "GET /favicon.ico HTTP/1.1" 500 745

該当のソースコード

Python

1from bottle import route, run 2import RPi.GPIO as GPIO 3 4host = '192.168.1.8' 5 6GPIO.setmode(GPIO.BCM) 7led_pins = [2, 4, 5] 8led_states = [0, 0, 0] 9switch_pin = 17 10 11GPIO.setup(led_pins[0], GPIO.OUT) 12GPIO.setup(led_pins[1], GPIO.OUT) 13GPIO.setup(led_pins[2], GPIO.OUT) 14GPIO.setup(switch_pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) 15 16def switch_status(): 17 state = GPIO.input(switch_pin) 18 if state: 19 return 'Up' 20 else: 21 return 'Down' 22 23def html_for_led(led): 24 l = str(led) 25 result = " <input type='button' onClick='changed(" + l + ")' value='LED " + l + "'/>" 26 return result 27 28def update_leds(): 29 for i, value in enumerate(led_states): 30 GPIO.output(led_pins[i], value) 31 32@route('/') 33@route('/<led>') 34def index(led="n"): 35 print(led) 36 if led != "n": 37 led_num = int(led) 38 led_states[led_num] = not led_states[led_num] 39 update_leds() 40 response = "<script>" 41 response += "function changed(led)" 42 response += "{" 43 response += " window.location.href='/' + led" 44 response += "}" 45 response += "</script>" 46 47 response += '<h1>GPIO Control</h1>' 48 response += '<h2>Button=' + switch_status() + '</h2>' 49 response += '<h2>LEDs</h2>' 50 response += html_for_led(0) 51 response += html_for_led(1) 52 response += html_for_led(2) 53 return response 54 55run(host='0.0.0.0', port=80) 56

試したこと

favicon.icoと書いてあったため https://www.favicon.cc/?action=icon&file_id=14586 のアイコンをダウンロードし上記の@route('/')の下に下記のコードを書いてみたりしました(変数の型が違うみたいなことを言われたためやめた)。どうにかしてfavicon.icoを送れればいいと思ってますがあってますか?

@route('/favicon.ico') def favcon(): fav=None return fav('favicon.ico', root='./static')

またこのサイトを見て.icoが送れそうなところを抜粋して書いたりしました。

補足情報(FW/ツールのバージョンなど)

使っているラズベリーパイはRasPizeroWでアプリはPython3(IDLE)です。
なお、python-bottleのバージョンが古いのかと思いコマンドでインストールするやつをやったところ最新のやつでした。

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

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

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

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

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

guest

回答1

0

ベストアンサー

現在 index()関数の実装は

Python

1@route('/') 2@route('/<led>') 3def index(led="n"): 4 print(led) 5 if led != "n": 6 led_num = int(led) 7 # (以下略)

となっておりますので、'/favicon.ico' が呼ばれた場合 led='favicon.ico' の引数で index関数が呼ばれてしまいます。

その場合は、led != 'n' の条件文は Trueとなりますので、その後の処理が行われ、最終的に

Python

1led_num = int(led)

にて、文字列 'favicon.ico' が int型にキャストできずにエラーが発生してしまいます。

とりあえずの修正としては上記のコードを

Python

1@route('/') 2@route('/<led:int>') 3def index(led=None): 4 print(led) 5 if (led is not None) and (0 <= led < len(led_status)): 6 led_num = int(led) 7 # (以下略)

のようにすることで

  • @route('/<led:int>') とすることで、int型以外の引数で index()関数が呼ばれないようにする
  • 引数がない事を明確にするために、デフォルト引数を led=None に変更する(これは好み)
  • ledの数の範囲外の値で呼ばれた場合の条件文のなかに入らないようにする

できるのではないでしょうか。

投稿2019/08/29 09:29

magichan

総合スコア15898

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

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

退会済みユーザー

退会済みユーザー

2019/08/29 09:45

<led>にfavicon.icoが代入されてしまうということでよろしいでしょうか? あまり関係ないですが is not None という構文があるんですね、、 python全く知らなくてこのようなところに頼ってしまったので 上記の該当のコードを直して試したところ404 Not foundとなってしまいました。 エラーコードです。 ``` None 127.0.0.1 - - [29/Aug/2019 18:40:47] "GET / HTTP/1.1" 200 291 127.0.0.1 - - [29/Aug/2019 18:40:53] "GET /favicon.ico HTTP/1.1" 404 735 ```
magichan

2019/08/29 09:52 編集

favicon.ico はお気に入り登録されたときなどに、そこに表示されるアイコンですので、別に無くても問題ありませんし、実際に無いのであれば 404 になるのは妥当かと思います。 「ブラウザが要求してきたけど、それは無いよ」くらいの意味なので気にする必要も無い気がします。
magichan

2019/08/29 09:52

それとも、あえて favicon.ico を返すような仕様にしたいということでしょうか?
退会済みユーザー

退会済みユーザー

2019/08/29 10:07

すいません。「それはないよ~」でいいのですがやりかたがわかりません。よろしければ教えてください。 回答いただきありがとうございます。
退会済みユーザー

退会済みユーザー

2019/08/29 10:17

すみません。読み間違えてました。404になって結果画面が表示されないので、どうにかできませんか?たびたびすみません。。
magichan

2019/08/29 11:01 編集

ん? 「404 Not found」になるのは、あくまでも "http://****/favicon.ico " を呼んだときかと思うのですが、違います?? 通常通り、 "http://*****/ " を呼んだ場合や、"http://*****/1 " などと数値の場合は問題なく index関数が呼ばれるので従来どおりの動作をすると思いますよ。
退会済みユーザー

退会済みユーザー

2019/08/29 14:10

できてました、、、 http://***/Noneでできるのかなぁ~って思ってできなくて勘違いしてました、、申し訳ないです。 この度はありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問