загрузка файла из шаблона Flask во внешние API - PullRequest
0 голосов
/ 05 мая 2020
  • Я разделил свое приложение flask на API из двух частей (Flask API) и веб-приложение (Flask шаблон).
  • Из веб-приложения я пытаюсь загрузить файл, но на стороне API я не могу отправить.
  • Загрузка файла работает со стороны API, я тестировал его у почтальона.
  • Шаблон (пользовательский интерфейс с портом: 3010 ) и API (порт: 3009)

Ниже выполняется на стороне API с портом 3009

@app.route('/sources', methods=['POST', 'GET'])
def upload_file():
    if request.method == 'POST':
        try:
            print(request.form.get('file')) # Not able to print file here
            print(request.form.get('Language1'))  # I am able to print it
            if 'file' not in request.files:
                resp = jsonify({'message' : 'No file part in the request'})
                resp.status_code = 400
                return resp             
            file = request.files['file']
            if file.filename == '':
                resp = jsonify({'message' : 'No file selected for uploading'})
                resp.status_code = 400
                return resp
            if file and allowed_file(file.filename,'sources'):
                sourceFileName = secure_filename(file.filename)
                Lang1 = request.form.get('Language1')
                Lang2 = request.form.get('Language2')

        except Exception as e:
            print(e)
            resp = jsonify({'message' : 'Server Error'})
            resp.status_code = 500
            return resp

Ниже выполняется на стороне пользовательского интерфейса с портом 3010

@app.route('/sources', methods=['POST'])
def upload_sources():
    if request.method == "POST":
        Language1 = request.form["Language1"]
        Language2 = request.form["Language2"]
        file = request.files["file"]
        # File object is printing here like: [<FileStorage: 'source_text.docx' ('application/vnd.openxmlformats-officedocument.wordprocessingml.document')>]
        print(file) 
        params = {
                  "Language1":Language1,
                  "Language2":Language2,
                  "file":file
                 }
        headers = {'content-type': 'application/json'}
        req = requests.post('http://localhost:3009/sources', headers=headers, data=params)
        r = req.json()
        print(r['message']) # I am getting response message : ['No file part in the request']

    return redirect(url_for('fetch_sources'))

Ниже все работает нормально, просто загружаю загруженный файл

@app.route('/sources', methods=['GET'])
def fetch_sources():
    sources = requests.get('http://localhost:3009/sources')
    source_data = sources.json()
    if source_data:
        return render_template('sources.html', sources=source_data['sources'])

1 Ответ

0 голосов
/ 13 мая 2020

Я отправлял объект файла, и способ, которым я следовал, был неправильным ...

Я не могу отправить файл напрямую в API из webapp. Здесь я изменил свой код, и он работает нормально.

if request.method == 'POST':
    file = request.files["file"]
    sourceFileName = secure_filename(file.filename)
    cwd = os.getcwd()+'/'
    if 'temp' not in os.listdir(cwd):
        os.mkdir(cwd + 'temp')
    file.save(os.path.join(cwd + 'temp', sourceFileName))

    with open(cwd + 'temp/'+ sourceFileName, 'rb') as f:
        data_file = ImmutableMultiDict([("file", f)])
        resp = requests.post(api_base_url + "/sources",
                             files=data_file)
...