#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 и включит его в заголовки части.