Я работал над приложением в стиле Pinterest, где пользователи могут загружать булавки вместе с изображением. После создания «FileView», который представляет собой API, который загружает полученный файл на S3 и предоставляет веб-интерфейсу полученный URL-адрес изображения, я успешно протестировал Postman. Ниже приведены мой фрагмент кода views.py и снимок экрана с запросом Postman.
views.py
class FileView(View):
s3_client = boto3.client(
's3',
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_ACCESS_KEY
)
@login_required
def post(self, request, **kwargs):
user = kwargs['user']
user_id = kwargs['user_id']
name = request.POST.get('title')
paragraph1 = request.POST.get('text', None)
board = request.POST.get('board', 1)
board = Board.objects.get(id=board)
print(request.FILES)
if request.FILES == None:
return JsonResponse({"message": "REQUEST FILES IS EMPTY"}, status=406)
file = request.FILES['filename']
self.s3_client.upload_fileobj(
file,
"pinterrorist",
file.name,
ExtraArgs={
"ContentType": file.content_type
}
)
image_url = S3URL+file.name
image_url = image_url.replace(" ", "+")
new_pin = Pin.objects.create(
image_url = image_url,
name = name,
paragraph1 = paragraph1,
board = board
)
new_pin.user.add(user)
new_pin = model_to_dict(new_pin, fields=["image_url", "name", "paragraph1", "board"])
return JsonResponse({"new_pin": new_pin})
Однако когда я пытаюсь решить это с помощью внешнего интерфейса, запрос не отправляет go через views.py. Он проходит через декоратор, что означает, что с токеном авторизации заголовка все в порядке. Я поискал в Интернете способы исправить это, но один из них упомянул, что мне нужно избавиться от заголовков, но я не могу этого сделать, потому что запрос ДОЛЖЕН содержать заголовки с токеном авторизации.
Ниже приведен код, созданный моим коллегой с помощью REACT.
const savePins = () => {
const fd = new FormData();
fd.append("filename", uploadedfile);
fd.append("title", title);
fd.append("text", imgDes);
fetch("http://10.58.0.207:8000/pin-builder", {
method: "POST",
headers: {
// "content-type": "multipart/form-data",
"Content-Type":
"multipart/form-data; boundary=----WebKitFormBoundaryIn312MOjBWdkffIM",
Authorization:
"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpZCI6IjIifQ.kg_TKT_XrRsqMRGUSAac5Uonq3STzSLDlt9d5ZbRzFw",
},
body: fd,
}).then(function (res) {
if (res.ok) {
alert("Perfect");
console.log(res);
} else {
alert("Oops");
console.log(res);
}
});}
Когда она отправляет запрос, я попытался выяснить, в какой части он отправляет ошибку. Я использовал pdb, чтобы найти деталь:
django.utils.datastructures.MultiValueDictKeyError: 'filename'
> /Users/woohyunan/projects/Wecode/pinterrorist-backend/pin/views.py(90)post()
-> file = request.FILES['filename']
Что-то не так с кодом внешнего интерфейса (реакции) или внутреннего интерфейса (django)? Я ничего не знаю о программировании REACT, но я хотел бы знать, как это исправить, чтобы я мог продолжать работать над этим проектом с интерфейсными инженерами.
Заранее большое спасибо!