2016-11-30 142 views
0

我是Flask的新手,我試圖在點擊html頁面中的按鈕後從後臺運行python腳本。這裏是我的代碼:在Flask中使用html運行python腳本

app.py 
    from flask import * 
    from functools import wraps 
    import sqlite3 

    app = Flask(__name__) 
    @app.route('/') 
    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命令沒有執行。我還是新來的瓶子,我會提出任何有關如何使其工作的建議。

+3

這根本沒有任何意義。您不能在模板內隨機執行腳本。這種事情必須在Flask代碼中完成;無論在myfile.py中,都應該放在另一個處理函數中。 –

+1

從來沒有聽說過客戶端JavaScript中的exec命令。如果您想在後臺運行python代碼,請使用XHR(AJAX)調用Flask端點並在服務器上運行所需的python代碼。 – abigperson

回答

2

HTML中的<script>標記專門用於運行客戶端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('/') 
def home(): 
    return render_template('home.html') 

@app.route('/generate') 
def generate(): 
    print 'Hello World!' 
    return render_template('process.html') 

如果你這樣做了,你就不必了拆分所有代碼到單獨的文件。不幸的是,模板會在代碼執行後呈現,因此您的process.html模板中顯示的「正在處理...」會在處理完畢後顯示。至於瓶去,我所知道的最好的方式來顯示該過程發生將重定向回頁面和閃爍的消息,這樣用戶:

@app.route('/generate') 
def generate(): 
    print 'Hello World!' 
    flash('Process complete!') 
    return redirect(url_for(home)) 

,然後在home.html你有這樣的事情(從Flask 0.11 Documentation):

{% 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="{{ url_for('generate') }}">click me</a></p> 
<p> lorem epsum </p> 
<div> 
{% endblock %} 

如果你想要的東西,像「處理...」,以顯示在頁面上,這時候你會想使用JavaScript。

希望這有助於:)