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

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

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

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Python

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

Q&A

解決済

1回答

5981閲覧

FlaskでPython内でソケット通信で取得した値をHTMLでブラウザ上に表示させたいのですが、ブラウザに表示されません。

akirabrian67

総合スコア11

Flask

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

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

ソケット

TCP/IPにおいて、IPアドレスとサブアドレスであるポート番号を組み合わせたネットワークアドレスのことを呼びます。また、ソフトウェアアプリケーションにおいて、TCP/IP通信を行う為の仮想的なインターフェースという意味もある。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Python

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

0グッド

0クリップ

投稿2020/10/17 03:12

編集2020/10/17 06:59

前提・実現したいこと

ソケット通信により外部から取得した値をHTML上で表示させたいのですが以下のエラーが表示され、ローカルサーバのブラウザ上で表示させることができません。

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

イメージ説明
イメージ説明
イメージ説明

該当のソースコード

Python

1from flask import * # 必要なライブラリのインポート 2 3 4comand = "あいうえお" 5 6app = Flask(__name__) # アプリの設定 7 8 9@app.route("/") # どのページで実行する関数か設定 10def index(): 11 12 return render_template('index.html', comand=response) 13 14 15 16if __name__ == "__main__": # 実行されたら 17 app.run(debug=False, host='localhost', port=9999) # debug=False でRestartingを無効にする、host="'0'0'0'0"ではなくローカルホストにすること

Python

1import logging 2import socket 3import webbrowser 4 5webbrowser.open_new('https://docs.python.org/ja/3/library/index.html') # ブラウザーに接続 6 7logging.basicConfig(level=logging.DEBUG, format='%(threadName)s: %(message)s') 8host_ip = '192.168.24.204' # PLCのIPアドレス 9host_port = 8501 # 上位リンク通信のポート番号(デフォルト値) 10 11logging.debug('start') 12client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 13# socket.AF_INETでip4を使うことを指定。socket.SOCK_STREAMでTCPを使うことを指定。 14 15try: 16 #クライアント接続 17 client.connect((host_ip,host_port)) # サーバーに接続(kv-7500にTCP接続/上位リンク通信) 18except: 19 print("PLC接続NG") 20 21 22 23 24 25comand = "RD DM1016.D\r" # 上位リンク通信のコマンド(データ読み出しコマンド、左から順に、読み出しコード、IOの番号、?。 26 # DM1016:生産数日 27 28#comand = "RDS DM53000.D 2\r" # 上位リンク通信のコマンド(データ連続読み出しコマンド) 29 30 31 #[.D]⇒±10進数32BIT表示・・・返り値は10桁の0埋め数値 32 33client.send(comand.encode("ascii")) # 上位リンク通信のデータコードがASCIIなのでエンコード  34 # ASCII:文字コード 35 # comand を ASCII にエンコード 36 # エンコード:他の形式に変換すること 37print("send : " + comand) 38 39response = client.recv(64) # 受信用バイト配列を定義しておく 40response = response.decode("UTF-8") # PLCからの返答がbyteデータなのでUTF-8にデコード 41 # UTF-8: 文字コード ASCIIよりデータサイズが小さい 42 # デコード:エンコードされたものをもとの形式に戻すこと 43 44client.close() 45 46print("Received :" ,response) 47logging.debug('end')

Python

1from flask import * # 必要なライブラリのインポート 2import logging 3import socket 4import webbrowser 5 6 # webbrowser.open_new('https://docs.python.org/ja/3/library/index.html') # ブラウザーに接続 7 8logging.basicConfig(level=logging.DEBUG, format='%(threadName)s: %(message)s') 9host_ip = '192.168.24.204' # PLCのIPアドレス 10host_port = 8501 # 上位リンク通信のポート番号(デフォルト値) 11 12logging.debug('start') 13client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 14# socket.AF_INETでip4を使うことを指定。socket.SOCK_STREAMでTCPを使うことを指定。 15 16try: 17 #クライアント接続 18 client.connect((host_ip,host_port)) # サーバーに接続(kv-7500にTCP接続/上位リンク通信) 19except: 20 print("PLC接続NG") 21 22 23 24 25 26comand = "RD DM1016.D\r" # 上位リンク通信のコマンド(データ読み出しコマンド、左から順に、読み出しコード、IOの番号、?。 27 # DM1016:生産数日 28 29#comand = "RDS DM53000.D 2\r" # 上位リンク通信のコマンド(データ連続読み出しコマンド) 30 31 32 #[.D]⇒±10進数32BIT表示・・・返り値は10桁の0埋め数値 33 34client.send(comand.encode("ascii")) # 上位リンク通信のデータコードがASCIIなのでエンコード  35 # ASCII:文字コード 36 # comand を ASCII にエンコード 37 # エンコード:他の形式に変換すること 38print("send : " + comand) 39 40response = client.recv(64) # 受信用バイト配列を定義しておく 41response = response.decode("UTF-8") # PLCからの返答がbyteデータなのでUTF-8にデコード 42 # UTF-8: 文字コード ASCIIよりデータサイズが小さい 43 # デコード:エンコードされたものをもとの形式に戻すこと 44 45client.close() 46 47print("Received :" ,response) 48logging.debug('end') 49 50 51 52app = Flask(__name__) # アプリの設定 53 54 55@app.route("/") # どのページで実行する関数か設定 56 57def index(): 58 return render_template("index.html", command=response) # Hello, World! を出力 59 60 61 62if __name__ == "__main__": # 実行されたら 63 app.run(debug=False, host='localhost', port=9999) # debug=False でRestartingを無効にする、host="'0'0'0'0"ではなくローカルホストにすること

HTML

1<!doctype html> 2 3<html lang="ja"> 4 <head> 5 <meta charset="utf-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> 7 <title>{{ comand }}</title> 8 </head> 9 <body> 10 <h1>生産数{{ comand }}</h1> 11 </body> 12</html>

試したこと

上記のソケット通信のコードをもう一つのPythonのコードに組み込み、comandという変数をそろえて実行しましたが同様のエラーが発生いたします。
数日前にも同様の質問をしましたが解決できませんでした。

comand という変数が数値を受け取るものではなく、コマンド入れているだけだったので、index()内のcomand という部分をresponse に変えてみましたが、以前表示されません。
具体的なエラーの流れは

デバック

コマンドプロンプロ上に「 Running on http://localhost:9999/ 」と表示されます (画像2)

実際に http://localhost:9999/ に飛ぶ

例外がスローされましたと表示される (画像1)

ブラウザは読み込み中のまま (画像3)

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

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

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

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

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

shinami

2020/10/17 05:41

私は、PythonもFlaskも知らないので想像でしか無いのですが。 まず、PLCのデータメモリ1016の内容を読んでコマンドプロンプトへ正しく表示された事と 前回の内容でcomandへ"あいうえお"などの定数を単純にブラウザへ表示できない事から PLCとの通信は関係ないと思われます。 単純な文字をブラウザへ表示できれば、ソケット通信の関数へ飛びresponseの内容を引っ張ってくれば良い訳ですから。 @app.route("/") def index(): #ここへ、comand = "あいうえお" またはソケット通信の関数へ飛びその戻り値をcomandへ入れれば良いのでは?私はPythonを知らないので文法的に間違っているかもしれませんが。 return render_template('index.html', comand=comand) あれ?表示したいのは、comandではなくresponseの内容ですよね?comandに入っているのは送信コマンドの"RD DM1016.D\r"の方ですから。
dodox86

2020/10/17 06:45

「1. index()でcomand=comand をcomand=responseに変更いたしました。」2020/10/17 15:04 に編集された質問内容を見て: > index()内のcomand という部分をresponse に変えてみましたが、以前表示されません。 comandからresponseにただ置き換えだだけではダメなのではないですか? response変数は宣言もされていなければセットもされていませんよね。NameErrorの例外が起きてしまうのではないですか?それともflaskのフレームワーク上であれば大丈夫なのでしょうか。
shinami

2020/10/17 07:00

あと、第2引数を無しにして return render_template('index.html') だけでページの表示だけは出来るんでしたっけ? これで表示できないとするとそこからという事になりますが。 環境が正しく整っているかどうかなどにも関係してくるかもしれませんね。
akirabrian67

2020/10/17 07:01

ソケット通信のコードとFlaskのコードを合わせた状態で実行しています。(先ほど合わせたコードも追加いたしました。) ソケット通信の後、Flaskを用いているので、その時点でresponseは宣言とセットがされているものかと思うのですが、Flask内で再度宣言&セットが必要ということでしょうか?
dodox86

2020/10/17 07:16

>@質問者 akirabrian67さん > Flaskを用いているので、その時点でresponseは宣言とセットがされているものかと思うのですが、Flask内で再度宣言&セットが必要ということでしょうか? 私は、「該当のソースコード」の内、一番上に掲載された以下のPythonスクリプトを見て言っています。 ここから>>>> from flask import * # 必要なライブラリのインポート comand = "あいうえお" app = Flask(__name__) # アプリの設定 @app.route("/") # どのページで実行する関数か設定 def index(): return render_template('index.html', comand=response) if __name__ == "__main__": # 実行されたら app.run(debug=False, host='localhost', port=9999) # debug=False でRestartingを無効にする、host="'0'0'0'0"ではなくローカルホストにするこ <<<ここまで このコードで見るとresponseは突然、出現しています。抜粋版だったのかもしれませんが、動くようには思えません。そうではなく、実際に試されたコードでresponse変数のスコープが正しく、更に意図通りの値が入っているのであればそれでよいです。 ただまず、基本にもどって、shinamiさんのコメントで指摘されている事項も確認すべきかと思います。
guest

回答1

0

自己解決

1、comand という変数が受け取っているものが数字ではなくコマンドだったのでcomand → response に変更しました。

2、度重なるHTMLファイルの新規作成をしていたため、パスが間違っていました。

非常に助かりました。ありがとうございました。

投稿2020/10/17 07:16

akirabrian67

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問