在Flask中使用html运行python脚本

时间:2016-11-30 18:11:21

标签: python html flask

我是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命令没有执行。我还是新手,我会建议如何让它发挥作用。

1 个答案:

答案 0 :(得分:4)

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模板中显示的'Processing ...'会在处理完毕后显示。就Flask而言,我知道向用户显示进程发生的最佳方式是重定向回页面并刷新消息,如下所示:

@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的时候。

希望这有助于:)