Я вообще не могу загрузить изображение в свою базу данных
Я использую django ninja back end, код работает, но когда я пытаюсь отправить его через приложение, которое я делаю с помощью javascript или даже с помощью bash, он не работает
я пробовал
`def upload_media(request, nome:str, imgurl: UploadedFile ):
usuarios = Media.objects.all()
Media.objects.create(nome = nome,imgurl=imgurl)
возвращается 1`
и
class mediaSchema(Schema): nome : str imgurl: UploadedFile
`@api.post('tst/', response=mediaSchema) def upload_media2(request, infos : mediaSchema):
media
= infos.dict() infos = Mean(**media)<<<<1><1>>>>infos.save()
возвращается 1`
Проблемы с кодом:
-
<<<Тип
- UploadedFile
в imgurl обрабатывается некорректно. UploadedFile должен управляться через request.FILES Django, а не напрямую как параметр. Функция получает usuarios = Media.objects.all(), но не использует его. Эта строка является лишней. Также отсутствует обработка ошибок при загрузке файлов или неверных данных. И наконец, возвращаемое значение 1 не имеет смысла.
from django.http import JsonResponse from django.core.files.uploadedfile import UploadedFile def upload_media(request, nome: str, imgurl: UploadedFile): if request.method != "POST": return JsonResponse({"error": "Only POST method allowed"}, status=405) # Ensure file is uploaded via request.FILES if not request.FILES.get("imgurl"): return JsonResponse({"error": "File not uploaded"}, status=400) # Save the uploaded file imgurl = request.FILES["imgurl"] # Retrieve the file from request media = Media.objects.create(nome=nome, imgurl=imgurl) return JsonResponse({"message": "Media uploaded successfully", "media_id": media.id})
Проблемы с классом mediaSchema и upload_media2: UploadedFile в mediaSchema не работает, как ожидалось, с Django Ninja. Ninja использует File(...) для обработки загрузки файлов. infos.dict() не сможет правильно обработать UploadedFile, потому что это не сериализуемое поле. Попытка напрямую создать объект Media из mediaSchema (Media(**media)) некорректна, поскольку imgurl не является совместимым полем
.from ninja import Schema, File from django.core.files.uploadedfile import UploadedFile from ninja import ModelSchema class MediaSchema(Schema): nome: str imgurl: UploadedFile @api.post('tst/', response={200: str, 400: str}) def upload_media2(request, nome: str, imgurl: UploadedFile = File(...)): try: media = Media.objects.create(nome=nome, imgurl=imgurl) return 200, "Media uploaded successfully!" except Exception as e: return 400, f"Error occurred: {str(e)}"
Проблема в том, что в первом случае вы неправильно объявили схему, file
должна быть указана отдельно, вы сделали это правильно, а все остальные (дополнительные) поля должны были быть указаны как Form
схема, а не как nome:str
. Итак, в первом случае ваш контроллер должен выглядеть примерно так:
from ninja import Form, Schema, UploadedFile
app = NinjaAPI()
class UserDetailsSchema(Schema):
username: str
@app.post("/upload/")
def upload_media(request, details: Form[UserDetailsSchema], input_file: UploadedFile):
return {'username': details.username, 'file_name': input_file.name}
В результате получится примерно следующий код для отправки с помощью javascript
:
formData.append('username', 'Alex');
formData.append('input_file', file);
await fetch('http://127.0.0.1:8000/usuarios/api/upload/', {
body:formData,
method: 'POST',
// something extra
}).then(response=> response.json()).then(result => console.log(result))
// console.log output => {username: 'Alex', file_name: 'test.png'}
Или это можно сделать с помощью другого варианта:
from ninja import File, Schema, UploadedFile
app = NinjaAPI()
class UserDetailsSchema(Schema):
username: str
@app.post("/upload/")
def upload_media(
request,
details: UserDetailsSchema,
# or => input_file: UploadedFile
input_file: File[UploadedFile]):
return {'details': details, 'file_name': input_file.name}
Соответственно, код для отправки данных в javascript
должен выглядеть примерно так:
formData.append('details', JSON.stringify({ username: 'Alex' }));
formData.append('input_file', file);
await fetch('http://127.0.0.1:8000/usuarios/api/upload/', {
body:formData,
method: 'POST',
}).then(response=> response.json()).then(result => console.log(result))
// console.log output => {details: {username: 'Alex'}, file_name: 'test.png'}
Это должно сработать, в целом документация, как мне кажется, дает четкие примеры.