Загрузите, если файл не существует, и отправьте его с помощью Flask - PullRequest
0 голосов
/ 03 июля 2019

Машина A (и это виртуальная машина) запрашивает ресурс на машине B, которая является сервером Flask.Если файл отсутствует на B, B запрос C (где файл).Вопрос: как перенести данные обратно в А после того, как Б их скачал?

Вот мой код:

from flask import Flask, request, render_template
from pathlib import Path
from werkzeug import secure_filename    

import subprocess

app = Flask(__name__)
bashCommand="scp -i ~/.ssh/id_rsa ubuntu@machineC:/home/ubuntu/ostechnix.txt /home/adriano/"
file_content=""
@app.route('/', methods=['GET'])
def lora_frames_handler():
        if request.method == 'GET':
            print("Ca pop:")
            #received_json = request.get_json()
            #print(received_json)
        my_file = Path("/home/adriano/ostechnix.txt")
        if my_file.is_file():
            # file exists
            print("File present")
            file_content=""
        else:
            print("Not present")
            process = subprocess.Popen(bashCommand.split(), stdout=subprocess.PIPE) #with this I get the file on local
            output, error = process.communicate()
        with open("/home/adriano/ostechnix.txt") as f:
                file_content=f.read()    #This doesn't work
        return file_content

    if __name__ == '__main__':
        app.run(host="0.0.0.0", port=8080)

Спасибо за помощь,

Warok

1 Ответ

1 голос
/ 03 июля 2019

Вы пробовали flask.send_file?

http://flask.pocoo.org/docs/1.0/api/#flask.send_file

Вот подтверждение концепции:

from flask import Flask, jsonify, request, render_template, send_file
from pathlib import Path
import subprocess

app = Flask(__name__)


@app.route('/')
def proxy_file():
    file_to_send = Path('/path/to/file')
    if not file_to_send.exists():
        # file does not exist
        fetch_file()

    # now we have the file
    return send_file(str(file_to_send))

def fetch_file():
    command = 'command to fetch the file'
    process = subprocess.Popen(command.split(), stdout=subprocess.PIPE)
    output, error = process.communicate()


if __name__ == "__main__":
    app.run()

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

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