【问题标题】:Show absolute URL for uploaded file显示上传文件的绝对 URL
【发布时间】:2020-12-04 07:05:08
【问题描述】:

我用 DRF 实现了一个文件上传端点,问题是文件没有显示文件的绝对 url,如下图所示。我希望绝对网址以http://localhost ....

开头

这是我的 django 设置

STATIC_URL = '/static/'

# The folder hosting the files 

STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static'),]


## Serving the STATIC FILES
# As declared in NginX conf, it must match /src/static/
STATIC_ROOT = os.path.join(os.path.dirname(os.path.dirname(BASE_DIR)), 'static')


MEDIA_URL = '/media/'

# do the same for media files, it must match /opt/services/djangoapp/media/
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

models.py

class Document(models.Model):
    """This represents document class model."""
    file = models.FileField(upload_to='documents/inspections/%Y/%m/%d')
    timestamp = models.DateTimeField(auto_now_add=True)

    @property
    def name(self):
        name = self.file.name[33:]
        return name

【问题讨论】:

  • 除非您有权访问 request 对象,否则您无法在模型级别执行此操作。最好在序列化器上这样做
  • 请添加你的序列化器,也许我可以试试

标签: django django-rest-framework


【解决方案1】:

默认情况下,如果您在序列化程序上下文中传递请求,Django rest 框架会为文件字段构建绝对 URL。尝试像这样在序列化程序中传递请求。

serializer = YourSerializer(<OTHER_ARGS>, context={'request': request})

您将自动获得绝对 URL。

【讨论】:

    【解决方案2】:

    Django 不为存储在 models.ImageField 中的图像提供绝对 URL。但是您可以修改您的序列化程序并使用serializer.SerializerMethodField 执行此操作。因为您没有提供序列化程序,所以我认为它可能看起来像这样:

    class Document(seralizer.ModelSerializer):
        file_url = serializer.SerializerMethodField()
        class Meta:
               model = Document
               fields = ('id','name','timestamp','file_url')
    
        def get_file_url(self, document):
            request = self.context.get('request')
            file_url = document.file.url
            return request.build_absolute_uri(file_url)
    

    【讨论】:

      【解决方案3】:

      为了让事情变得更简单,我使用cloudinary 来托管我的图像,因为最终我会将它们存储在生产环境中的云中。

      因此:

      1. 已安装所需的云 Python 包,即 cloudinarydj3-cloudinary-storage

      2. 在已安装的应用中添加了cloudinary

          INSTALLED_APPS = [
              ......
              'rest_framework',
              'django_extensions',
              'corsheaders',
              'cloudinary', # Add cloudinary 
              'drf_yasg',
              'celery',
              'django_prometheus',
              'debug_toolbar',
              
          
          ]
      
      1. 更改了 settings.py 中的默认文件存储并添加了 cloudinary 配置:
      
      CLOUDINARY_STORAGE = {
          'CLOUD_NAME': '*******',
          'API_KEY': '*********',
          'API_SECRET': '*********',
      }
      
      
      DEFAULT_FILE_STORAGE = 'cloudinary_storage.storage.MediaCloudinaryStorage'
      
      1. 在根目录urls.py中删除了下面不再需要它

      urlpatterns+= static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

      测试上传结果如下:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多