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

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

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

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

Python 3.x

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

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Raspberry Pi

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

Python

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

Q&A

解決済

1回答

1366閲覧

リロードするたびにタプルにデータを格納し最新の5つを出力したい

Alex_M

総合スコア32

Flask

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

Python 3.x

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

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Raspberry Pi

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

Python

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

0グッド

0クリップ

投稿2020/10/03 12:59

前提

Raspberry Pi ZERO WH でPythonのFlaskを利用し簡易的なWebサーバーを作っています。
Flaskを用いて以下のようなWebページを制作するため、色々検索したのですが参考になる結果が得られず藁にもすがる思いでこちらで質問致しました。

###実現したいこと
・時刻とCPU温度はリロードするたびに新しいデータとして格納する
・過去5回の結果を下に押し出して表示したい。 (他人からアクセスされることは想定しない)
・5回より以前のデータは破棄したい。

以下が実行結果のイメージです。新しい結果を一番上に表示させ、古いデータは下に。
<1回目(ページを開いた時)>
イメージ説明
<2回目(1回リロードしたとき)>
イメージ説明
<5回目以降(4回以上リロードしたとき)>
イメージ説明

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

ページを開いた時orリロードしたときの1つのデータを持ってくるプログラムは作成したのですが、
そこからリロードする度にリスト?に格納する方法がわかりません。

該当のソースコード

Python

1from flask import Flask, render_template 2import subprocess 3import datetime 4app = Flask(__name__) 5 6@app.route('/') 7def root_page(): 8 proc = subprocess.run(['vcgencmd', 'measure_temp'], capture_output=True, text=True) 9 temp = proc.stdout[5:9] 10 date = datetime.datetime.now() 11 now = date.strftime("%Y-%m-%d %H:%M:%S") 12 return render_template('index.html', temperature=temp, datetime=now) 13 14if __name__ == '__main__': 15 app.run(debug=True, host='0.0.0.0', port=8888, threaded=True)

returnでテンプレートに1つの値を渡していますが、リストを渡すと考えています。

html

1<!DOCTYPE html> 2<html lang="ja"> 3 <head> 4 <meta charset="UTF-8" /> 5 <link rel="stylesheet" href="/static/css/main.css" /> 6 <title>Raspberry Pi Server</title> 7 </head> 8 <body id="normal-box4"> 9 <h1>Raspberry PiのCPU温度</h1> 10 <p>時刻:<span>{{ datetime }}</span></p> 11 <p>CPU温度は<span id="temp">{{ temperature }}</span>です</p> 12 </body> 13</html>

また、データの個数だけ繰り返してhtml要素を作るのに

html

1{% for temp in temperatures}<p>temperatures[temp]</p>{% endfor %}

は適切でしょうか?

試したこと

かなりググったのですが役立つ情報を見つけられず、知識もないため限界を感じたため質問させて頂きました。

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

GNU nano 3.2
Python3.7.6

PythonもRaspberry Piもかなりの初心者です。
なにか不足している情報があればすぐに補足いたしますのでコメントお願い致します。

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

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

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

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

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

FiroProchainezo

2020/10/05 01:41

Webでデータを永続化する場合はDBに入れた方があとあと便利です。 簡単なもので良いと思うので、sqliteを使ってみてはいかがでしょうか?
guest

回答1

0

ベストアンサー

deque を使ってはどうでしょう
初期化時に最大保持件数を指定するだけで、後はリストのように使えます。

python

1import random 2from collections import deque 3 4def main(): 5 data = deque(maxlen=5) # 最新5件のみ保持 6 for _ in range(10): # 10 回リロードを想定 7 data.append(random.randint(1, 10)) # 適当な乱数 8 print(data) 9 10if __name__ == "__main__": 11 main()

最新5件が格納されているのを示すためのサンプル出力です。
dequeは、リストと同じように扱えるので、適切に整形してください。

python

1deque([3], maxlen=5) 2deque([3, 4], maxlen=5) 3deque([3, 4, 8], maxlen=5) 4deque([3, 4, 8, 9], maxlen=5) 5deque([3, 4, 8, 9, 7], maxlen=5) 6deque([4, 8, 9, 7, 2], maxlen=5) 7deque([8, 9, 7, 2, 7], maxlen=5) 8deque([9, 7, 2, 7, 6], maxlen=5) 9deque([7, 2, 7, 6, 1], maxlen=5) 10deque([2, 7, 6, 1, 7], maxlen=5)

実際の運用では、データは破棄せずに、データベースに格納し
最新5件を取り出す等したほうがいいかもしれません。


テンプレートエンジンには詳しくないので、気になる点だけ

html

1{% for temp in temperatures}<p>temperatures[temp]</p>{% endfor %}

temperatures[temp] は temp ではありませんか?
JavaScript では配列の添字ですが、Pythonでは配列の要素が変数にはいります。
実際に出力して確認してみてください。

投稿2020/10/03 21:17

teamikl

総合スコア8664

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問