我想将管理Django表单上传到gcloud。我的gcloud部分可以工作,但是需要一个文件路径。我想从表单上传中访问文件的原始数据,并将其提供给gcloud的blob
上传。
我有一个看起来像这样的模型
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.upload
的blob函数是什么?
如果未动态键入python,则很容易看到适合的位置,但不适合。
答案 0 :(得分:2)
您将以 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()