Как сделать POST, используя модуль запросов с сервером Flask?

#python #post #flask #python-requests

#python #Публикация #flask #python-запросы

Вопрос:

У меня возникли проблемы с загрузкой файла на мой сервер Flask с использованием модуля запросов для Python.

 import os
from flask import Flask, request, redirect, url_for
from werkzeug import secure_filename

UPLOAD_FOLDER = '/Upload/'


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


@app.route("/", methods=['GET', 'POST'])
def index():
    if request.method == 'POST':
        file = request.files['file']
        if file:
            filename = secure_filename(file.filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
            return redirect(url_for('index'))
    return """
    <!doctype html>
    <title>Upload new File</title>
    <h1>Upload new File</h1>
    <form action="" method=post enctype=multipart/form-data>
      <p><input type=file name=file>
         <input type=submit value=Upload>
    </form>
    <p>%s</p>
    """ % "<br>".join(os.listdir(app.config['UPLOAD_FOLDER'],))

if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True)
  

Я могу загрузить файл через веб-страницу, но я хотел загрузить файл с помощью модуля запросов следующим образом:

 import requests
r = requests.post('http://127.0.0.1:5000', files={'random.txt': open('random.txt', 'rb')})
  

Он продолжает возвращать 400 и говорит, что «браузер (или прокси) отправил запрос, который этот сервер не смог понять»

Я чувствую, что мне не хватает чего-то простого, но я не могу понять это.

Ответ №1:

Потому что у вас есть <input> name=file so, вам нужно

  files={'file': ('random.txt', open('random.txt', 'rb'))}
  

Примеры в документе запросов: ОПУБЛИКОВАТЬ файл с кодировкой из нескольких частей

Ответ №2:

Вы загружаете файл в качестве random.txt поля:

 files={'random.txt': open('random.txt', 'rb')}
#      ^^^^^^^^^^^^ this is the field name
  

но вместо этого найдите поле с именем file :

 file = request.files['file']
#                    ^^^^^^ the field name
  

Сделайте так, чтобы эти два совпадали; file files например, используя для словаря:

 files={'file': open('random.txt', 'rb')}
  

Обратите внимание, что requests это автоматически определит имя файла для этого открытого fileobject и включит его в заголовки части.