Skip to main content
 首页 » 编程设计

python之如何使用 django-storage sftp 下载文件

2024年09月07日32yxwkf

我正在使用 django 存储模块使用 sftp 将文件存储在某个位置,现在我们需要从 sftp 下载相同的文件。

有什么建议吗?

模型.py

from storages.backends.sftpstorage import SFTPStorage 
SFS = SFTPStorage() 
 
class Configurations(BaseModel): 
name = models.CharField(max_length=150, unique=True) 
file = models.FileField(upload_to='configurations', storage=SFS) 
descriptions = models.TextField(null=True, blank=True) 

设置.py

DEFAULT_FILE_STORAGE = 'storages.backends.sftpstorage.SFTPStorage' 
 
SFTP_STORAGE_HOST = '127.0.0.1' 
SFTP_STORAGE_ROOT = '/var/www/media/' 
SFTP_STORAGE_PARAMS = { 
    'username': 'root', 
    'password': 'password', 
    'allow_agent': False, 
    'look_for_keys': False, 
} 
# SFTP_KNOWN_HOST_FILE = '~/.ssh/known_hosts' 
SFTP_STORAGE_INTERACTIVE = False 

View .py

from django.http import Http404 
 
from rest_framework import viewsets 
from rest_framework.parsers import MultiPartParser, FormParser 
 
from .models import (CustomConfigurations) 
from .serializers import (CustomConfigurationsSerializers) 
 
 
class ToolCustomConfigurationsViewSet(viewsets.ModelViewSet): 
    queryset = CustomConfigurations.objects.all() 
    parser_classes = (FormParser, MultiPartParser,) 
    serializer_class = CustomConfigurationsSerializers 
 
    def get_queryset(self): 
        queryset = self.queryset.all().order_by('-id') 
        return queryset 

序列化器.py

class CustomConfigurationsSerializers(serializers.ModelSerializer): 
class Meta: 
    model = CustomConfigurations 
    fields = '__all__' 

请您参考如下方法:

这是我的解决方案:

@action(methods=['get'], detail=True) 
def download(self, request, pk=None): 
 
    try: 
        obj = CustomConfigurations.objects.get(id=pk) 
    except CustomConfigurations.DoesNotExist: 
        raise Http404 
 
    if SFS.exists(obj.file.name): 
        file = SFS._read(obj.file.name) 
        type, encoding = mimetypes.guess_type(obj.file.name) 
        response = HttpResponse(file, content_type=type) 
        response['Content-Disposition'] = u'attachment; filename="{filename}'.format( 
            filename=obj.file.name) 
        return response 
    raise Http404