Я вообще не могу загрузить изображение в свою базу данных

Я использую 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'}

Это должно сработать, в целом документация, как мне кажется, дает четкие примеры.

Вернуться на верх