Загрузка файла Django (получение ДАННЫХ файла, а не только пути к файлу)

#django #python-3.x

#django #python-3.x

Вопрос:

Я хочу загрузить форму администратора Django в gcloud. Моя часть gcloud работает, но требует пути к файлу. Я хотел бы получить доступ к необработанным данным файла из формы загрузки и предоставить их для blob загрузки gcloud.

У меня есть модель, которая выглядит следующим образом

 from django.db import models
from gcloud import storage
from oauth2client.service_account import ServiceAccountCredentials

# Create your models here.
class TestFile(models.Model):
    name = models.CharField(max_length=64,
        # NOT NULL, UNIQUE, no default.
        null=False, default=None, blank=False, unique=True
    )
    data = models.FileField()
    img_src = models.CharField(max_length=255,
        null=True, default=None, blank=True
    )
    def save(self, *args, **kwargs):
        super(TestFile, self).save(*args, **kwargs)
        filename = self.data.url
        print("FILENAME: "   filename)
        # How do I get the file DATA
  

У меня также есть таблица администратора, подобная этой.

 from django.contrib import admin
from django.utils.safestring import mark_safe

from .models import TestFile

class TestFileAdmin(admin.ModelAdmin):
        list_display = ( 
                "data",
                "name",
                "_img_src",
        )   
        def _img_src(self, obj):
                return mark_safe(u'<img style="height: 75px;width: 75px;object-fit: cover;" src="%s"/>' % obj.img_src)
admin.site.register(TestFile, TestFileAdmin)
  

Используя любой сервер хранилища, который я хочу, у меня есть несколько примеров кода, подобных этому:

 from gcloud import storage
from oauth2client.service_account import ServiceAccountCredentials
import os

credentials_dict = { 
        "type": "service_account",
        "client_id": os.environ["BACKUP_CLIENT_ID"],
        "client_email": os.environ["BACKUP_CLIENT_EMAIL"],
        "private_key_id": os.environ["BACKUP_PRIVATE_KEY_ID"],
        "private_key": os.environ["BACKUP_PRIVATE_KEY"],
}

credentials = ServiceAccountCredentials.from_json_keyfile_dict(
        credentials_dict
)
client = storage.Client(credentials=credentials, project="aerobic-copilot-232607")
bucket = client.get_bucket("tgtree")
blob = bucket.blob("temp.png")
blob.upload_from_filename("./temp.png")
# How to I upload from DATA?
url = blob.public_url
print(url)
  

Вопросы:

Как мне перехватить save() функцию и получить фактические байты данных из self.data ?

Как только это будет сделано, какая функция blob для передачи этого в blob.upload ?

Если бы python не был динамически типизирован, было бы легко увидеть, что где подходит, но это не так.

Ответ №1:

Вы получите данные в виде self.data.read()

пример :

 def save(self, *args, **kwargs):
    super(TestFile, self).save(*args, **kwargs)
    filename = self.data.url
    print("FILENAME: "   filename)
    data_in_bytes = self.data.read()  

Ссылка : class FieldFile