Как передать файл inMemoryUploadedFile в api
Я хочу передавать загруженные пользователем изображения в api из моего представления У меня есть форма, которая отправляет файл в представление
<form action="http://127.0.0.1:8000/handler/" method="POST" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit">
</form>
Я хочу снова отправить этот файл в api, но я не могу сделать это напрямую, я думаю, что я должен преобразовать файл в строку и передать в api. У кого-нибудь есть идеи, как это сделать
@csrf_exempt
def handler(request):
if request.method == 'POST':
file = request.FILES['file']
res = requests.post('http://192.168.1.68:8000/endpoint/',{})
Если нужно преобразовать файл в строку, можно использовать file.read().
Но это не рекомендуется, если загруженный файл огромен, он может перегрузить вашу систему, если вы попытаетесь считать его в память.
Для лучшей практики следует использовать TemporaryUploadedFile и открыть поток для отправки любого содержимого:
# file handle by "TemporaryUploadedFile" already
file = request.FILES['file']
res = requests.post('http://192.168.1.68:8000/endpoint/', {
"file": open(file.temporary_file_path(), 'rb'),
})
Это для будущего меня или кого-то, у кого может быть такая же проблема.
Убедитесь, что соблюдаются правильные заголовки при использовании requests lib и отправке файлов.
Я следую коду и ничего не работает, потому что мы используем удаленные модели, поэтому у нас есть конструкторы и диктант заголовков устанавливал другой 'тип содержимого'.
Итак, если вам нужно установить токен для вызова api, вы можете использовать его следующим образом:
getFile = request.FILES['form-data-name'].file.getvalue()
file = {'form-data-name': getFile,} #The other api get this field
self.response = requests.post(
f'{self.service}/resource/{pk}/action/',
headers={'Authorization': f'Bearer {self.token}'},
files=file
)