4

私は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

  • 3

    それはまったく意味がありません。 テンプレート内でスクリプトをランダムに実行することはできません。 そのようなことは、Flask コードで行う必要があります。 myfile.py 内にあるものはすべて、別のハンドラー関数にある必要があります。

    2016 年 11 月 30 日 18:14

  • 1

    クライアント側の JavaScript で exec コマンドを聞いたことはありません。 バックグラウンドで Python コードを実行する場合は、XHR (AJAX) を使用して Flask エンドポイントを呼び出し、サーバー上で目的の Python コードを実行します。

    2016 年 11 月 30 日 18:35

5

<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 を使用する必要があります。

うまくいけば、これは役に立ちます:)

    あなたの答え

    ゲストとして投稿する

    必須ですが表示されません


    「回答を投稿する」をクリックすることにより、あなたは私たちの 利用規約プライバシーポリシークッキーポリシー

    あなたが探している答えではありませんか? タグ付けされた他の質問を閲覧する パイソン html フラスコ また 自分の質問をする.