gpt4 book ai didi

python - Django在不同的服务器上传File Field和ImageField

转载 作者:行者123 更新时间:2023-12-04 09:04:37 25 4
gpt4 key购买 nike

我想制作一个系统,用户可以在其中上传文档文件和图像(都用于不同的任务)
我想将文件存储在我自己的 ftp 服务器中,并将图像存储在 s3 存储桶中。
我正在使用 django-storages包裹
从未见过这样的 Django 方法,其中 FileFieldImageField s可以上传到不同的服务器
例如,假设当用户上传文件时,文件会上传到我的 ftp 服务器

FTP_USER = 'testuser'#os.environ['FTP_USER']
FTP_PASS = 'testpassword'#os.environ['FTP_PASS']
FTP_PORT = '21'#os.environ['FTP_PORT']
DEFAULT_FILE_STORAGE = 'storages.backends.ftp.FTPStorage'
FTP_STORAGE_LOCATION = 'ftp://' + FTP_USER + ':' + FTP_PASS + '@192.168.0.200:' + FTP_PORT




# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/

STATIC_URL = '/static/'

STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static_my_proj"),
]

STATIC_ROOT = os.path.join(BASE_DIR, "static_cdn", "static_root")


MEDIA_URL = 'ftp://192.168.0.200/'
MEDIA_ROOT = 'ftp://192.168.0.200/'#os.path.join(BASE_DIR, "static_cdn", "media_root")
但问题是图像现在也转到 ftp 服务器
因为这个
DEFAULT_FILE_STORAGE = 'storages.backends.ftp.FTPStorage'
是的,我知道我可以像这样在上传的服务器根目录中创建不同的目录
def get_filename_ext(filepath):
base_name = os.path.basename(filepath)
name, ext = os.path.splitext(base_name)
return name, ext


def upload_image_path(instance, filename):
# print(instance)
#print(filename)
new_filename = random.randint(1,3910209312)
name, ext = get_filename_ext(filename)
final_filename = '{new_filename}{ext}'.format(new_filename=new_filename, ext=ext)
return "myapp/{new_filename}/{final_filename}".format(
new_filename=new_filename,
final_filename=final_filename
)

class Product(models.Model):
title = models.CharField(max_length=120)
slug = models.SlugField(blank=True, unique=True)
document = models.FileField(upload_to=upload_image_path, null=True, blank=True)

def get_absolute_url(self):
#return "/products/{slug}/".format(slug=self.slug)
return reverse("detail", kwargs={"slug": self.slug})

def __str__(self):
return self.title
但这不是我想要的,我想要不同的服务器来上传文件和图像
这甚至可能吗?我的意思是只能有一个 MEDIA_ROOT那么我怎么能写两个服务器地址,我说得通吗?
编辑 1:
iain shelvington提到了一个很好的观点,即为自定义存储后端的每个字段添加存储选项
像这样
from storages.backends.ftp import FTPStorage
fs = FTPStorage()

class FTPTest(models.Model):
file = models.FileField(upload_to='srv/ftp/', storage=fs)

class Document(models.Model):
docfile = models.FileField(upload_to='documents')
并在设置中
DEFAULT_FILE_STORAGE = 'storages.backends.ftp.FTPStorage'
FTP_STORAGE_LOCATION = 'ftp://user:password@localhost:21
但是用户上传的照片也会上传到那个 ftp 服务器
到期 tp
DEFAULT_FILE_STORAGE = 'storages.backends.ftp.FTPStorage'
以及关于 MEDIA_URLMEDIA_ROOT他们只能是一个吧?
那么我怎么能把两个不同的服务器地址放在那里呢?
感谢您阅读本文,我真的很感激。

最佳答案

您可以设置一个 base_url FTPStorage 类为

from storages.backends.ftp import FTPStorage
from django.conf import settings

fs = FTPStorage(base_url=settings.FTP_STORAGE_LOCATION)


class FTPTest(models.Model):
file = models.FileField(upload_to='srv/ftp/', storage=fs)


class Document(models.Model):
docfile = models.FileField(upload_to='documents')
base_url 中很有用构建文件的“绝对 URL”因此你不需要 MEDIA_URLMEDIA_ROOT “在这种情况下”

I want different servers for file and image uploads.


您可以通过指定 来实现它storage 参数 FileField (或 ImageField)

but user uploaded photos also gets uploaded to that ftp server due to, DEFAULT_FILE_STORAGE settings.


这是你的选择。在您的情况下,默认存储类应该是什么?您需要将媒体文件上传到 S3 吗?或本地存储,项目在哪里运行?相应地设置值。

关于python - Django在不同的服务器上传File Field和ImageField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63477477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com