Я разработал свое первое приложение 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, чтобы заставить его работать.