[ad_1]
私はFlaskが初めてで、htmlページのボタンをクリックするとバックグラウンドからpythonスクリプトを実行しようとしています。 これが私のコードです:
from flask import *
from functools import wraps
import sqlite3
app = Flask(__name__)
@app.route("https://stackoverflow.com/")
def home():
return render_template('home.html')
@app.route('/generate')
def generate():
return render_template('process.html')
私のprocess.htmlは次のとおりです。
<html>
<head>
<body>
Processing...
<script>
exec('python /pth to my python file/myfile.py')
</script>
</body>
</head>
</html>
home.html は次のとおりです。
{% extends "template.html" %}
{% block content %}
<div class = "jumbo">
<h2> Home</h2>
<br/>
<p><a href="{{ url_for('generate') }}">click me</a></p>
<p> lorem epsum </p>
<div>
{% endblock %}
私はLinuxで作業していますが、上記のようにhtmlでexecを使用できるかどうかわかりません。 ただし、.html ファイル内の exec コマンドは実行されていません。 私はまだフラスコに慣れていないので、それを機能させる方法についての提案をいただければ幸いです。
2
の <script>
HTML の タグは、クライアント側の JavaScript コードを実行するためのものです。 バックエンド ロジックはビューで実行する必要があります。 に存在するコード行を実行したいだけの場合 myfile.py
、そのファイルの関数に入れ、次を使用してインポートする必要があります from myfile import functionname
または単にそのコードをビューに表示します (ほとんどの場合、後者が適切な方法です)。 たとえば、 myfile.py
含まれている print 'Hello World!'
ビューは次のようになります。
from flask import *
from functools import wraps
import sqlite3
app = Flask(__name__)
@app.route("https://stackoverflow.com/")
def home():
return render_template('home.html')
@app.route('/generate')
def generate():
print 'Hello World!'
return render_template('process.html')
このようにすれば、すべてのコードを個別のファイルに分割する必要はありません。 残念ながら、テンプレートはコードが実行された後にレンダリングされるため、「処理中…」 process.html
テンプレートは、すでに処理された後に表示されます。 Flask に関する限り、プロセスが行われたことをユーザーに示す最善の方法は、ページにリダイレクトして、次のようにメッセージを表示することです。
@app.route('/generate')
def generate():
print 'Hello World!'
flash('Process complete!')
return redirect(url_for(home))
そして、 home.html
あなたはこのようなものを持っているでしょう(から Flask 0.11 ドキュメント):
{% extends "template.html" %}
{% block content %}
<div class = "jumbo">
<h2> Home</h2>
<br/>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
<p><a href="https://stackoverflow.com/questions/40895329/{{ url_for("generate') }}">click me</a></p>
<p> lorem epsum </p>
<div>
{% endblock %}
「処理中…」のようなものをページに表示したい場合は、JavaScript を使用する必要があります。
うまくいけば、これは役に立ちます:)
それはまったく意味がありません。 テンプレート内でスクリプトをランダムに実行することはできません。 そのようなことは、Flask コードで行う必要があります。 myfile.py 内にあるものはすべて、別のハンドラー関数にある必要があります。
– ダニエル・ローズマン
2016 年 11 月 30 日 18:14
クライアント側の JavaScript で exec コマンドを聞いたことはありません。 バックグラウンドで Python コードを実行する場合は、XHR (AJAX) を使用して Flask エンドポイントを呼び出し、サーバー上で目的の Python コードを実行します。
– アビゲイル
2016 年 11 月 30 日 18:35
| |