我是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命令没有执行。我还是新手,我会建议如何让它发挥作用。
答案 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的时候。
希望这有助于:)