Как запустить скрипт Python в фоновом режиме при нажатии кнопки html с помощью фляги фреймворка - PullRequest
0 голосов
/ 23 марта 2019

'' 'upload.html' ''

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2 style="color:DodgerBlue;">File Uploader</h2>

<form id = "upload-form" action = "{{ url_for('upload') }}" method="POST" 
 enctype="multipart/form-data">
<input type = "file" name = "file" accept = "files/*" multiple>
<input type = "submit" value = "submit">
</form>
</body>
</html>

'' 'app.py' ''

import os
from flask import Flask, request, render_template, send_from_directory
app = Flask(__name__)

APP_ROOT = os.path.dirname(os.path.abspath(__file__))

@app.route("/")
def index():
return render_template("upload.html")

@app.route("/upload", methods=["POST"])
def upload():

target = os.path.join(APP_ROOT, 'Athena_XML_files/')
print(target)
if not os.path.isdir(target):
    os.mkdir(target)

for file in request.files.getlist("file"):
    print(file)
    filename = file.filename
    destination = "/".join([target, filename])
    print(destination)
    file.save(destination)
return render_template("complete.html")

@app.route('/run_script')
def run_script():
app.config.from_pyfile("main.py")
return render_template('result.html')

if __name__ == "__main__":
app.run(port=4555, debug=True)

'' 'complete.html' ''

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>XML files Uploaded</h1>
<ul><br><br>
<h2><strong>Please click to obtain the result</strong></h2><br><br>
<ul class="nav nav-stacked">
    <li role="presentation"><a href="{{ url_for('run_script') }}">CLICK  
HERE</a></li>
</ul>
</ul>
</body>
</html>

По мере загрузки файлов XML и нажатия кнопки НАЖМИТЕ ЗДЕСЬ, файл main.py должен запускаться в фоновом режиме, для которого я сделал функцию в файле app.py для запуска файла main.py.

Загрузка работает хорошо, но при нажатии кнопки файл main.py не работает в фоновом режиме.

1 Ответ

0 голосов
/ 24 марта 2019

Я не уверен, что ваша идея хорошая. Я опубликовал несколько небольших решений, но вы должны прочитать эту статью для лучшей практики.

1) Если вы хотите запустить внешний скрипт из колбы, вы можете использовать подпроцесс для запуска скрипта из командной строки.

@app.route('/run-script')
def run_script():
   result = subprocess.check_output("python main.py", shell=True)
   return render_template('results.html', **locals())

2) Если вы хотите запустить код Python в фоновом режиме без возврата, вы можете создать поток.

from threading import Thread

@app.route('/run-in-background')
def run_in_background():
    run_func()
    return redirect(url_for('.index'))

def run_func():
    data = { 'some': 'data', 'any': 'data' }
    thr = Thread(target=run_async_func, args=[app, data])
    thr.start()
    return thr

def run_async_func(app, data):
    with app.app_context():
    # Your working code here!
    example_module.do_somthing_with(data)

Не уверен, поможет ли это. Оба решения могут привести к путанице.

Вы должны прочитать документы по фляге. Функция app.config.from_pyfile оценивает данные конфигурации из кода Python. Это сильно отличается от вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...