質問編集履歴

2 HTMLファイルの追加

tasojiro

tasojiro score 7

2020/10/27 20:28  投稿

Pythonで外部ストレージ内のファイルを実行する方法
### 前提・実現したいこと
現在Webアプリケーションを開発しており、「Raspberry pi(以下、ラズパイ)」で「Flask」を利用して開発しています。
ここで、ラズパイ本体に保存されている「app.py」ファイルから外部ストレージとして接続されているUSB内の「message.py」というファイルを実行したいと考えています。
※追記
本問題は、「コード」による問題が原因だと考えています。なので、「外部ストレージ」関連の問題は考慮外であることをお伝えします。しかし、可能性は0では無いので、あくまで問題の本筋を外部ストレージ関連の問題で固定してしまわないようにお願いします。
※ファイルの説明
①「app.py」...ラズパイ本体に保存されている実行ファイル。Web上に用意しているテキストボックスに文字が入力され送信ボタンが押されると、「judg.py」ファイルへ値を送信する。
②「judg.py」...送られてきた値を元に、実行すべきファイルを外部ストレージから探して実行する。(今回は1つだけ)
③「message.py」...外部ストレージ内に入っているアプリケーション。掲示板アプリのようなもの。
### 発生している問題・エラーメッセージ
期待する動作は、「message」とテキストボックスに打ち込むと「message.py」が起動し、呼び出しているログインページに移動する事です。(出来れば別タブで開きたい...)
現状としては「message」と打ち込み送信すると、エラーなどは起こらないものの、ログインページにジャンプせずに元のページのメッセージ欄に「message is Active」と表示されるだけで終わってしまいます。
### 該当のソースコード
「app.py」
```Python
from flask import Flask, render_template, request
import judg
app = Flask(__name__)
@app.route('/')
def index():
   return render_template('index.html', message="what shall I do?")
@app.route('/', methods=['POST'])
def form():
   field = request.form['field']
   if request.method == 'POST':
       res = judg.judg(field)
   return render_template('index.html', message=res['msg'], answer=res['ans'])
if __name__=='__main__':
   app.run(debug=True, host='localhost')
```
「judg.py」
```Python
from flask import Flask, render_template, request, redirect
import os, sys
//外部ストレージとのパスを通す
sys.path.append(os.path.join(os.path.dirname(__file__), '/media/pi/NAS'))
import message
app = Flask(__name__)
@app.route('/')
def judg(field):
   if "message" in field:
       res = {'msg':"What shall I do?", 'ans':"message is Active!"}
       message.login()
       return res
   else:
       res = {'msg':"What shall I do?", 'ans':"Sorry.."}
       return res
```
「message.py」
```Python
from flask import Flask, render_template, request, session, redirect
app = Flask(__name__)
app.secret_key = b'abc'
member_data = {}
message_data = []
@app.route('/', methods=['GET'])
def index():
   global message_data
   if 'login' in session and session['login']:
       msg = 'Login id:' + session['id']
       return render_template('messages.html',
                              title='Messages',
                              message=msg,
                              data=message_data )
   else:
       return redirect('/login')
   
@app.route('/', methods=['POST'])
def form():
   msg = request.form.get('comment')
   message_data.append((session['id'], msg))
   if len(message_data) > 25:
       message_data.pop(0)
   return redirect('/')
#login page access
@app.route('/login', methods=['GET'])
def login():
   return render_template('login.html',
                          title='Login',
                          err=False,
                          message='IDとパスワ−ドを入力:',
                          id='' )
#login
@app.route('/login', methods=['POST'])
def login_post():
   global member_data
   id = request.form.get('id')
   pswd = request.form.get('pass')
   if id in member_data:
       if pswd == member_data[id]:
           session['login'] = True
       else:
           session['login'] = False
   else:
       member_data[id] = pswd
       session['login'] = True
   session['id'] = id
   if session['login']:
       return redirect('/')
   else:
       return render_template('login.html',
                              title='Login',
                              err=False,
                              message='パスワードが違います。',
                              id=id )
#logout
@app.route('/logout', methods=['GET'])
def logout():
   session.pop('id', None)
   session.pop('login')
   return redirect('/login')
if __name__== '__main__':
   app.run(debug=True, host='localhost', port=5000)
```
 
「layout.html」  
```HTML  
<!doctype html>  
<html lang="ja">  
<head>  
   <title>{% block titile %}{% endblock %}</title>  
   <meta charset="utf-8"/>  
   <link rel="stylesheet"  
       href="{{url_for('static', filename='style.css')}}">  
</head>  
<body>  
   <h1>{% block headline %}{% endblock %}</h1>  
     
   {% block content %}{% endblock %}  
     
   <div class="footer">  
       {% block footer %}{% endblock %}  
   </div>  
</body>  
</html>  
```  
 
「index.html」  
```HTML  
{% extends "layout.html" %}  
 
{% block title %}  
index  
{% endblock %}  
 
{% block headline %}  
Web Server  
{% endblock %}  
 
{% block content %}  
<p>{{ message }}</p>  
<div>  
   <form method="post" action="/" >  
       <input type="text" name="field">  
       <input type="submit" name="send" value="送信">  
   </form>  
</div>  
<p>Answer = {{ answer }}</p>  
{% endblock %}  
 
{% block footer %}  
RURSystem.  
{% endblock %}  
```  
 
「login.html」  
```HTML  
{% extends "layout.html" %}  
 
{% block title %}  
Login  
{% endblock %}  
 
{% block headline %}  
{{ title }}  
{% endblock %}  
 
{% block content %}  
<p>{{ message }}</p>  
<form method="post" aciton="/login">  
<table>  
   <tr>  
       <th>id</th>  
       <td>  
           <input type="text" name="id" value="{{id}}">  
       </td>  
   </tr>  
   <tr>  
       <th>password</th>  
       <td>  
           <input type="password" name="pass">  
       </td>  
   </tr>  
   <th></th><td>  
       <input type="submit" value="Login">  
   </td>  
   </div>  
</form>  
</table>  
{% endblock %}  
 
{% block footer %}  
RURSystem_Message board.  
{% endblock %}  
```  
 
「messages.html」  
```HTML  
{% extends "layout.html" %}  
 
{% block title %}  
Message  
{% endblock %}  
 
{% block headline %}  
{{ title }}  
{% endblock %}  
 
{% block content %}  
<div class="logout"><a href="logout">Logout</a></div>  
<p>{{ message }}</p>  
<form method="post" action="/">  
   <table>  
       <tr>  
           <th>Message</th>  
           <td>  
               <input type="text" name="comment" width="80">  
           </td>  
           <td>  
               <input type="submit" value="POST NOW">  
           </td>  
       </tr>  
   </table>  
</form>  
<hr>  
<ul>  
{% for item in data | reverse %}  
   <li>{{item[1]}} ({{item[0]}})</li>  
{% endfor %}     
</ul>  
{% endblock %}  
 
{% block footer %}  
tasojiro.  
{% endblock %}  
```  
 
「style.css」  
```CSS  
body{  
   margin: 10px;  
   background-color: aliceblue;  
   }  
h1{  
   color: lightsteelblue;  
   font-size: 36pt;  
   margin:0px;  
   }  
p{  
   font-size: 14pt;  
   }  
pre{  
   background-color: white;  
   font-size: 12pt;  
   padding: 10px;  
   }  
div.footer{  
   text-align: right;  
   border-bottom: 1px solid lightskyblue;  
   color: lightskyblue;  
   margin: 50px 0px;  
   }  
div.logout{  
   position: absolute;  
   right: 10px;  
   top: 10px;  
   font-weight: bold;  
   font-size: 12pt;  
   }  
 
```  
 
###ディレクトリ構成
「WebServer」
→(app.py)
→(judg.py)
→(「templates」 →login.html, layout.html, index.html)
→(「static」 →style.css)
「Skills」(外部ストレージ(USB内))
→(message.py)
→(「templates」 →layout.html, message.html)
→(「static」 →style.css)
### 最後に
Webアプリケーションは、まだ初心者なので間違っている事があれば指摘していただけると幸いです。
何か情報が不足している場合は、言っていただけると追加します。
よろしくお願いします。
  • Python

    36776 questions

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

  • Flask

    965 questions

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

  • Raspberry Pi

    2103 questions

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

1 質問内容に関してご指摘をいただいたので、追記させていただきます。

tasojiro

tasojiro score 7

2020/10/27 12:47  投稿

Pythonで外部ストレージ内のファイルを実行する方法
### 前提・実現したいこと
現在Webアプリケーションを開発しており、「Raspberry pi(以下、ラズパイ)」で「Flask」を利用して開発しています。
ここで、ラズパイ本体に保存されている「app.py」ファイルから外部ストレージとして接続されているUSB内の「message.py」というファイルを実行したいと考えています。
※追記  
本問題は、「コード」による問題が原因だと考えています。なので、「外部ストレージ」関連の問題は考慮外であることをお伝えします。しかし、可能性は0では無いので、あくまで問題の本筋を外部ストレージ関連の問題で固定してしまわないようにお願いします。  
※ファイルの説明
①「app.py」...ラズパイ本体に保存されている実行ファイル。Web上に用意しているテキストボックスに文字が入力され送信ボタンが押されると、「judg.py」ファイルへ値を送信する。
②「judg.py」...送られてきた値を元に、実行すべきファイルを外部ストレージから探して実行する。(今回は1つだけ)
③「message.py」...外部ストレージ内に入っているアプリケーション。掲示板アプリのようなもの。
### 発生している問題・エラーメッセージ
期待する動作は、「message」とテキストボックスに打ち込むと「message.py」が起動し、呼び出しているログインページに移動する事です。(出来れば別タブで開きたい...)
現状としては「message」と打ち込み送信すると、エラーなどは起こらないものの、ログインページにジャンプせずに元のページのメッセージ欄に「message is Active」と表示されるだけで終わってしまいます。
### 該当のソースコード
「app.py」
```Python
from flask import Flask, render_template, request
import judg
app = Flask(__name__)
@app.route('/')
def index():
   return render_template('index.html', message="what shall I do?")
@app.route('/', methods=['POST'])
def form():
   field = request.form['field']
   if request.method == 'POST':
       res = judg.judg(field)
   return render_template('index.html', message=res['msg'], answer=res['ans'])
if __name__=='__main__':
   app.run(debug=True, host='localhost')
```
「judg.py」
```Python
from flask import Flask, render_template, request, redirect
import os, sys
//外部ストレージとのパスを通す
sys.path.append(os.path.join(os.path.dirname(__file__), '/media/pi/NAS'))
import message
app = Flask(__name__)
@app.route('/')
def judg(field):
   if "message" in field:
       res = {'msg':"What shall I do?", 'ans':"message is Active!"}
       message.login()
       return res
   else:
       res = {'msg':"What shall I do?", 'ans':"Sorry.."}
       return res
```
「message.py」
```Python
from flask import Flask, render_template, request, session, redirect
app = Flask(__name__)
app.secret_key = b'abc'
member_data = {}
message_data = []
@app.route('/', methods=['GET'])
def index():
   global message_data
   if 'login' in session and session['login']:
       msg = 'Login id:' + session['id']
       return render_template('messages.html',
                              title='Messages',
                              message=msg,
                              data=message_data )
   else:
       return redirect('/login')
   
@app.route('/', methods=['POST'])
def form():
   msg = request.form.get('comment')
   message_data.append((session['id'], msg))
   if len(message_data) > 25:
       message_data.pop(0)
   return redirect('/')
#login page access
@app.route('/login', methods=['GET'])
def login():
   return render_template('login.html',
                          title='Login',
                          err=False,
                          message='IDとパスワ−ドを入力:',
                          id='' )
#login
@app.route('/login', methods=['POST'])
def login_post():
   global member_data
   id = request.form.get('id')
   pswd = request.form.get('pass')
   if id in member_data:
       if pswd == member_data[id]:
           session['login'] = True
       else:
           session['login'] = False
   else:
       member_data[id] = pswd
       session['login'] = True
   session['id'] = id
   if session['login']:
       return redirect('/')
   else:
       return render_template('login.html',
                              title='Login',
                              err=False,
                              message='パスワードが違います。',
                              id=id )
#logout
@app.route('/logout', methods=['GET'])
def logout():
   session.pop('id', None)
   session.pop('login')
   return redirect('/login')
if __name__== '__main__':
   app.run(debug=True, host='localhost', port=5000)
```
###ディレクトリ構成
「WebServer」
→(app.py)
→(judg.py)
→(「templates」 →login.html, layout.html, index.html)
→(「static」 →style.css)
「Skills」(外部ストレージ(USB内))
→(message.py)
→(「templates」 →layout.html, message.html)
→(「static」 →style.css)
### 最後に
Webアプリケーションは、まだ初心者なので間違っている事があれば指摘していただけると幸いです。
何か情報が不足している場合は、言っていただけると追加します。
よろしくお願いします。
  • Python

    36776 questions

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

  • Flask

    965 questions

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

  • Raspberry Pi

    2103 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る