Составные файлы не принимаются в приложении Python Flask, запущенном на рабочем сервере с минимальной конфигурацией WSGI - PullRequest
0 голосов
/ 09 июля 2020

Я разработал свое первое приложение python flask и запустил его на рабочем сервере с использованием WSGI с минимальной конфигурацией. Это приложение имеет API с методом запроса POST, который должен получать несколько составных файлов в запросе.

Существует проект java, который действует как клиент и инициирует HTTP-запрос POST вместе с составными файлами, чтобы это python flask приложение, работающее на производственном сервере WSGI.

Но всякий раз, когда я делаю HTTP-запрос к этому API в приложении python flask, я не получаю в запросе составные файлы, т.е. flask .request.files возвращает пустой словарь (ImmutableMultiDict ([])). Однако ошибки нет и получается 200 OK.

В отличие от этого, всякий раз, когда я запускаю приложение python flask на сервере разработки без WSGI. Приложение работает нормально, и я получаю составные файлы.

Это мой python flask API (my_flask_app.py)

from my_app_flask_two import extract
from flask import Flask
import os
import flask
import logging
import cgi

logging.basicConfig(level=logging.DEBUG, filename='output.log', filemode='w',
                    format='%(name)s - %(levelname)s - %(message)s')

app = Flask(__name__)
UPLOAD_FOLDER = os.getcwd()
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
templates = []


@app.route('/extract', methods=['POST'])
def box_extraction():
    logging.debug('Inside box_extraction')
    try:
        logging.debug('Request Is: ')
        logging.debug(flask.request)

        logging.debug('Files received are: ')
        logging.debug(flask.request.files)

        logging.debug('keys are: ')
        logging.debug(flask.request.files.keys())

        for key in  flask.request.files.keys():
            logging.debug('key is: ')
            logging.debug(key)

            image_files = flask.request.files.getlist(key)
            logging.debug(image_files)

            for image_file in image_files:
                image_file.save(os.path.join(app.config['UPLOAD_FOLDER'], image_file.filename))
                templates.append(image_file.filename)
    except Exception as e:
        logging.error("Exception occurred", exc_info=True)

    result = extract(templates)
    for template in templates:
        os.remove(template)

    templates.clear()
    logging.debug('Exit box_extraction')
    return result

Это сценарий (запуск. sh) Я использую для запуска сервера.


cd ../
python3 -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
uwsgi --socket 0.0.0.0:8000 --protocol=http -w wsgi1:app

Это файл, который запускает приложение flask. (wsgi1.py)

from my_flask_app import app

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

На рабочем сервере с WSGI вывод, который я получаю в файле журнала после выполнения запроса POST от клиента (java проект).

root - DEBUG - Inside box_extraction
root - DEBUG - Request Is: 
root - DEBUG - <Request 'http://0.0.0.0:8000/extract' [POST]>
root - DEBUG - Files received are: 
root - DEBUG - **ImmutableMultiDict([])**
root - DEBUG - keys are: 
root - DEBUG - <dict_keyiterator object at 0x10344f2f0>
root - DEBUG - Inside box_extraction
root - DEBUG - Exit box_extraction
root - DEBUG - Exit box_extraction

Вкл. сервер разработки без WSGI, вывод, который я получаю в файле журнала после выполнения запроса POST от клиента (java проект).

root - DEBUG - Inside box_extraction
root - DEBUG - Request Is:
root - DEBUG - <Request 'http://127.0.0.1:5000/extract' [POST]>
root - DEBUG - Files received are:
root - DEBUG - ImmutableMultiDict([('demofile0', <FileStorage: 'demo001.jpg' ('application/octet-stream; charset=ISO-8859-1')>), ('demofile1', <FileStorage: 'demo002.jpg' ('application/octet-stream; charset=ISO-8859-1')>)])
root - DEBUG - keys are:
root - DEBUG - <dict_keyiterator object at 0x11fe596b0>
root - DEBUG - key is:
root - DEBUG - demofile0
root - DEBUG - [<FileStorage: 'demo001.jpg' ('application/octet-stream; charset=ISO-8859-1')>]
root - DEBUG - key is:
root - DEBUG - demofile1
root - DEBUG - [<FileStorage: 'demo002.jpg' ('application/octet-stream; charset=ISO-8859-1')>]
root - DEBUG - Inside box_extraction
root - DEBUG - Inside box_extraction
root - DEBUG - Inside sort_contours
root - DEBUG - Exit sort_contours
root - DEBUG - Exit box_extraction
root - DEBUG - Inside box_extraction
root - DEBUG - Inside sort_contours
root - DEBUG - Exit sort_contours
root - DEBUG - Exit box_extraction
root - DEBUG - Exit box_extraction
root - DEBUG - Exit box_extraction
werkzeug - INFO - 127.0.0.1 - - [09/Jul/2020 20:14:44] "[37mPOST /extract HTTP/1.1[0m" 200 -

Как я выяснил, WSGI является посредником между веб-сервером и приложением python, поэтому я более скептически отношусь к конфигурации WSGI, но не могу понять, какие изменения я могу сделать в WSGI, чтобы заставить его работать.

...