POST-запрос работает от POSTMAN, но не в flask - PullRequest
0 голосов
/ 04 марта 2020

Предположим, что api url равен https://34.35.36.37: 8000 / api

Отправлено POST-запрос из приложения почтальона, которое успешно enter image description here

enter image description here

Прикрепленный файл (ключ = user_image) представляет собой файл .jpg

На стороне сервера (https://34.35.36.37: 8000 / api ):

@app.route('/api', methods=['POST'])
def api():
    print("check1")
    user_image = request.files['user_image']
    print("check2")
    return "some text"

Но когда я пытаюсь отправить запрос с помощью приложения flask, в котором отображается форма для загрузки изображения, которое затем отправляется на URL-адрес API, возникает ошибка

api_url = "https://34.35.36.37:8000/api"
content_type = 'application/json' 
headers = {'Content-Type': content_type}

class UploadForm(FlaskForm):
    user_image = FileField('Upload an image',validators=[FileAllowed(['jpg', 'png', 'jpeg'], u'Image only!'), FileRequired(u'File was empty!')])
    submit = SubmitField('Submit')

@app.route('/', methods=['GET','POST'])
def predict():
    form = UploadForm()
    if form.validate_on_submit():
        payload = {}
        files = [
          ('user_image', form.data['user_image'])
        ]
        #response = requests.post(api_url, data={'user_image': form.data['user_image']}, headers=headers, verify=False)
        response = requests.request("POST", api_url, headers=headers, data = payload, files = files, verify=False)
        print(response.text)
        return 'some text'

     return render_template('index.html', form=form)

При проверке на стороне сервера строка print('check1') выполняется, но строка print('check2') не выполняется.

Я думаю, что ошибка в следующих 2 строках, которые включают отправку изображения на URL-адрес API в запросе на публикацию

Строка1:

files = [
              ('user_image', form.data['user_image'])
            ]

Строка2:

response = requests.request("POST", api_url, headers=headers, data = payload, files = files, verify=False)

1 Ответ

0 голосов
/ 07 марта 2020
api_url = "https://34.35.36.37:8000/api"

class UploadForm(FlaskForm):
    user_image = FileField('Upload an image',validators=[FileAllowed(['jpg', 'png', 'jpeg'], u'Image only!'), FileRequired(u'File was empty!')])
    submit = SubmitField('Submit')

@app.route('/', methods=['GET','POST'])
def predict():
    form = UploadForm()
    if form.validate_on_submit():
        file_uploaded = request.files['user_image']
        files = {'user_image': file_uploaded.read()}
        response = requests.post(api_url, files = files)
        return 'some text'

     return render_template('index.html', form=form)

Приведенный выше код работал для меня. Это эквивалентно отправке запроса «POST» от почтальона после выбора файла в разделе «Body» с ключом «user_image». Не используйте заголовки в пост-запросе response = requests.post(api_url, files = files)

На стороне сервера (api_url) файл можно получить с помощью user_image = request.files['user_image']

...