2016-11-30 141 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。

希望这有助于:)