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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

1970閲覧

センサから取得したデータをブラウザ上で見れるようにしたい!

退会済みユーザー

退会済みユーザー

総合スコア0

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

Python

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/06/22 14:56

前提・実現したいこと

 ラズベリーパイ3 ModelB を温度・湿度・気圧センサと接続し,取得データをpythonでherokuに送信し,ブラウザ上でデータを見れるようにしたいです.
・送信側:python
・受信側:flask
以下のサイトを参考にプログラムを作りました.送信側プログラムはcronで定期的に動かそうと考えています.
【Linebot #3】家の温度をLineで通知するアプリ (BME280使用)
第39回「ラズベリーパイで温度・湿度・気圧をまとめて取得!AE-BME280でIC2通信」
[Python] 軽量WebフレームワークのFlaskに入門(準備、起動、HTML、静的ファイル、GET、POSTなど)

pythonを始めて約2週間なので,イマイチ分かってないです…

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

herokuにデプロイし,heroku open で見てみると以下のメッセージが…

Method Not Allowed the method is not allowed for the requested URL.

該当のソースコード

・送信側 app.py

python

1#coding: utf-8 2import bme280_custom #データ取得プログラム 3import urllib.request, urllib.parse 4 5csv = bme280_custom.readData() 6list = csv.split(",") 7press = list[0] 8temp = list[1] 9hum = list[2] 10 11def post_message(t, p, h): 12 print("post") 13 data = {} 14 data["temp"] = t 15 data["pres"] = p 16 data["hum"] = h 17 server_addr = "https://xxxx.herokuapp.com/" 18 try: 19 data = urllib.parse.urlencode(data).encode("utf-8") 20 with urllib.request.urlopen(server_addr, data=data) as res: 21 res = res.read().decode("utf-8") 22 print(res) 23 except: 24 print('error') 25 26post_message(temp, press, hum)

・受信側 server.py

python

1# coding: utf-8 2from flask import Flask, request, render_template 3app = Flask(__name__) 4 5@app.route("/",methods=['POST']) 6def info(): 7 t = float(request.form['temp']) 8 p = float(request.form['pres']) 9 h = float(request.form['hum']) 10 return render_template('index.html',t=t,h=h,p=p) 11 12if __name__ == "__main__": 13 app.run()

・index.html

HTML

1<!DOCTYPE html> 2<html lang="en"> 3 <head> 4 <meta charset="utf-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script> 8 <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-1q8mTJOASx8j1Au+a5WDVnPi2lkFfwwEAa8hDDdjZlpLegxhjVME1fgjWPGmkzs7" crossorigin="anonymous"> 9 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js" integrity="sha384-0mSbJDEHialfmuBBQP6A4Qrprq5OVfW37PRR3j5ELqxss1yVqOtnepnHVP9aJ7xS" crossorigin="anonymous"></script> 10 </head> 11 <body> 12 <div class="container"> 13 <div class="header"> 14 <form method="post"> 15 <h3 class="text-muted">温度:{{t}}℃,湿度:{{h}}%,気圧:{{p}}hPa</h3> 16 </form> 17 </div> 18 </div> 19 </body> 20</html>

・Procfile

web: gunicorn app:app

試したこと

アプリケーション?自体は開いてるのでflask側のプログラムがおかしいと思い調べるも解決せず…
私は以下のようになると考えています.
1.取得したデータを指定したURLに送る
2.デプロイされたプログラムをopenするとデータが見れる
この考えは違うのでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

原因はPOSTのみ許可しているのに、GETでリクエストをおくっていることです。

python3:app.py

1def post_message(t, p, h): 2 print("post") 3 data = {} 4 data["temp"] = t 5 data["pres"] = p 6 data["hum"] = h 7 server_addr = "https://xxxx.herokuapp.com/" 8 try: 9 data = urllib.parse.urlencode(data).encode("utf-8") 10 #ここでPOSTではなくGETを送っている。 11 with urllib.request.urlopen(server_addr, data=data) as res: 12 res = res.read().decode("utf-8") 13 print(res) 14 except: 15 print('error')

以下のように変えてみてください。

python3:app.py

1def post_message(t, p, h): 2 print("post") 3 data = {} 4 data["temp"] = t 5 data["pres"] = p 6 data["hum"] = h 7 server_addr = "https://xxxx.herokuapp.com/" 8 try: 9 data = urllib.parse.urlencode(data).encode("utf-8") 10 #先にPOSTリクエストを作ってしまう。 11 req = urllib.request.Request(server_addr, data=data, method="POST") 12 #作ったリクエストを使って接続 13 with urllib.request.urlopen(req) as res: 14 res = res.read().decode("utf-8") 15 print(res) 16 except: 17 print('error')

投稿2018/06/22 15:42

編集2018/06/22 15:45
frodo821

総合スコア322

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

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

退会済みユーザー

退会済みユーザー

2018/06/22 17:24

回答ありがとうございます. 試しましたが https://xxxx.herokuapp.com/ を開いても変わってなかったです… しかし app.py を動かすと変数 res の中身がプリントされるようにはなりました. herokuへデプロイするファイルは server.py Procfile requirements.txt templates(index.html入り) であってますでしょうか?
frodo821

2018/06/22 17:42

あ、ごめんなさい。理解が間違ってました。Raspberry Piからデータを送信してPCのブラウザで見たいって言うことでしょうか?
frodo821

2018/06/22 17:58 編集

https://gist.github.com/frodo821/6616da56252d01b118970dc952933b7e こうするとPOSTでデータ更新、GETで表示といった動作ができます。 統計やデータの保存が必要なら、データベースの利用を検討してください。CSVという手もありますが、時間のスパンが巨大になる場合読み込みに時間がかかったり、ファイルサイズがとても大きくなるのでおすすめできません。
退会済みユーザー

退会済みユーザー

2018/06/23 01:54

回答ありがとうございます!今回はブラウザ上でデータを見ることだけ考えています. 結果ですが,herokuで動かすと温度のみ nan℃ と表示されます…湿度,気圧は表示されています. しかし,localで動かすと温度,湿度,気圧は表示できています.何が原因かよく分からないです…
frodo821

2018/06/23 02:11 編集

POSTで適当にデータを送れば表示されるはずです。 想定動作としては、 ①サーバー起動 ②起動直後はデータが無いのでNaNを使用 ③POSTでデータが送信される ④データを更新 ⑤GET要求 ⑥設定された値を表示 ③④、⑤⑥を独立に繰り返す といった感じです。ですので、POSTでデータがセットされるまでの表示はNaNになります。 どういった手順で動作確認しているのかよく分からないのでなんとも言えませんが...。
frodo821

2018/06/23 02:10

ですが温度が表示されない、と言うのは不可解ですねぇ...。温度のデータは何を使っているのでしょう?実測データですか?
退会済みユーザー

退会済みユーザー

2018/06/23 02:33

実測データ使ってます…
frodo821

2018/06/23 03:01 編集

温度計のデータをログ表示できますか?たとえば湿度だけNaNであれば、湿度が正しく送信できていないと推測できます。気圧と湿度であれば、少なくとも気圧が正しく送信できていません。ですが温度だけNaNという状態は、そもそもNaNを送っていなければあり得ないはずです。確かめてみてください。
退会済みユーザー

退会済みユーザー

2018/06/23 03:29

heroku logs のことでしょうか?
frodo821

2018/06/23 03:48

いえ。送信側のプログラムで送信するデータをロギングできないかな、と。温度計のデータがとれていない可能性がありますので。 勿論heroku logでPOSTリクエストのステータスコードも見る必要があると思いますが...。
退会済みユーザー

退会済みユーザー

2018/06/24 04:19

返信遅れてすいません 時間をおいてから,サーバー起動→データ送信 を行うと全てのデータが表示されました!なぜNaNとなっていたのか不思議です.データも取得してましたし…
frodo821

2018/06/24 07:33

そうですか。無事解決してよかったです。
退会済みユーザー

退会済みユーザー

2018/06/24 14:23

いろいろ教えてくださりありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問