如何从django API返回保存在mongodb中的文件



我正在努力返回一个文件,例如上传到mongodb的pdf。我可以将文件上传到数据库,但无法再次检索该文件。返回文件时,我的端点(视图(应该是什么样子?我使用的是django rest框架v3.12.4和djongo v1.3.6。我使用drf-yasg v1.20.0作为API的文档。以下是我的设置,models.py,serializers.py,views.py和urls.py:

# app settings.py
DATABASES = {
'default': {
'ENGINE': 'djongo',
'NAME': 'TAST_DB2',
'CLIENT': {
'host': 'localhost',
'port': 27017,
'username': 'root',
'password': 'reallychangeme',        # :-)
'authSource': 'admin',
'authMechanism': 'SCRAM-SHA-1'
} 
}
}
DEFAULT_FILE_STORAGE = 'mongo_storage.storage.GridFSStorage'
GRIDFS_DATABASE = 'myfiles'
BASE_URL = 'http://localhost:8085/'
UPLOADED_FILES_USE_URL = True
# models.py
from django.db import models
from djongo.storage import GridFSStorage
grid_fs_storage = GridFSStorage(collection='myfiles', base_url=''.join([settings.BASE_URL, 'myfiles/']))
class TestStandardFile(models.Model):
myfile = models.FileField(upload_to='teststandards1', storage=grid_fs_storage)
# serializers.py
from rest_framework import serializers 
from teststandards.models import TestStandardFile
class TestStandardFileSerializer(serializers.ModelSerializer):
class Meta:
model = TestStandardFile
fields = '__all__'
# views.py
from rest_framework.generics import ListCreateAPIView
from .models import TestStandard
from .serializers import TestStandardFileSerializer
from rest_framework.parsers import MultiPartParser
# used for the upload
class FileView(ListCreateAPIView):
parser_classes = ( MultiPartParser,)
serializer_class = TestStandardFileSerializer
queryset = TestStandardFile.objects.all()
<----------      !ENDPOINT FOR FILE RETRIEVAL MISSING HERE???
# urls.py
urlpatterns = [ 
re_path(r'^api/teststandards/file', api.FileView.as_view(), name='teststandard-file'),
re_path(r'^myfiles/(?P<pk>[0-9]+)$', api.myfiles.as_view(), name='get-file'),
]

我可以看到我的文件正确上传到mongodb与mongodb指南针。其中有三个集合:

  1. TAST_DB2.测试标准文件
  2. TAST_DB2.myfiles.teststandards1.files
  3. TAST_DB2.myfiles.teststandards1.chunks

我假设我需要一个端点,它将文件作为响应返回。我试图覆盖"myfiles"终结点的"get"函数。但我不知道如何从请求的文件中获取文件句柄。我不知道如何将文件作为HttpResponse返回。

感谢您的帮助!

我终于开始工作了。我创建了一个RetrieveAPIView来检索一个条目,并覆盖了检索函数。这就是我的观点.py的样子:

# for upload
class FileView(ListCreateAPIView):
parser_classes = ( MultiPartParser,)
serializer_class = TestStandardFileSerializer
queryset = TestStandardFile.objects.all()

# download
class myfiles(RetrieveAPIView):
parser_classes = ( MultiPartParser,)
serializer_class = TestStandardFileSerializer
queryset = TestStandardFile.objects.all()

def retrieve(self, request, *args, **kwargs):
obj = self.get_object()        
response = HttpResponse(obj.myfile, content_type='application/octet-stream')
response['Content-Disposition'] = 'attachment; filename=%s' % obj.myfile
return response

"myfile";是我的模型中FileField的名称。使用drf_specific进行swagger文档。这为文件检索生成了一个不错的下载按钮。在测试上传/下载功能的过程中,它起到了很大的作用。

最新更新