Django - пост InMemoryUploadedFile на внешний REST API - PullRequest
0 голосов
/ 05 июля 2018

В Django Rest Framework я хотел бы опубликовать файл, полученный как InMemoryUploadedFile, на другой сервер, как только он будет получен.

Звучит просто, но функция request.post(), похоже, неправильно отправляет такой файл:

def post(self, request, *args, **kwargs):
    data = request.data
    print(data)
    # <QueryDict: {'file': [<InMemoryUploadedFile: myfile.pdf (application/pdf)>]}>
    endpoint = OTHER_API_URL + "/endpoint"
    r = requests.post(endpoint, files=data)

Мой другой сервер получает запрос (через колбу) с именем файла, но не с содержимым:

@app.route("/endpoint", methods=["POST"])
def endpoint():
    if flask.request.method == "POST":
        # I removed the many checks to simplify the code
        file = flask.request.files['file']
        path = os.path.join(UPLOAD_FOLDER, file.filename)
        file.save(path)        

        print(file) #<FileStorage: u'file.pdf' (None)>
        print(os.path.getsize(path)) #0

        return [{"response":"ok"}]

При публикации файла непосредственно в этот API в форме данных с почтальоном, он работает как положено:

        print(file) # <FileStorage: u'file.pdf' ('application/pdf')>
        print(os.path.getsize(path)) #8541

Любая помощь в том, как это исправить, то есть преобразовать тип InMemoryUploadedFile во что-то, что может понять обычный API REST? Или, может быть, просто добавление правильных заголовков?

1 Ответ

0 голосов
/ 18 апреля 2019

Мне пришлось выяснить эту проблему, передав загруженный файл с внешнего сайта Django в бэкэнд-API Django в Python 3. К фактическим данным файла InMemoryUploadedFile можно получить доступ через метод .getvalue () свойства объекта .file.

        path="path/to/api"
        in_memory_uploaded_file = request.FILES['my_file']
        io_file = in_memory_uploaded_file.file
        file_value = io_file.getvalue()
        files = {'my_file': file_value}
        make_http_request(path, files=files)

и может быть сокращено

        file = request.FILES['my_file'].file.getvalue()
        files = {'my_file': file}

До этого при попытке отправить объекты InMemoryUploadFile, свойство файла или результат метода read () все было доказано, что к моменту получения API-интерфейса файл пустым / пустым был отправлен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...