【问题标题】:Full media absolute paths with graphene-django使用 graphene-django 的完整媒体绝对路径
【发布时间】:2020-04-25 03:45:18
【问题描述】:

我目前正在从使用 DRF 切换到 django-graphene,同时将 boto3 和 s3 用于媒体内容。使用 DRF 时,文件字段将返回 s3 存储桶内媒体的完整路径。但是,graphene-django 文件字段仅返回相对路径。

例如,使用 DRF,文件字段会返回完整的 url,例如:

https://bucket.s3.amazonaws.com/logos/logos_2019-11-07_172356.1808000000.png

但使用 graphene-django,它又回来了:

/logos/logos_2019-11-07_172356.1808000000.png

是否需要添加中间件?还是我需要创建自己的缩放器来处理这个问题?一般来说,我对 graphene-django 和 graphql 很陌生。因此,非常感谢任何帮助。

【问题讨论】:

    标签: django graphene-django


    【解决方案1】:

    您可以添加自定义字段来构建完整的 URL,如下所示。

    class FileType(DjangoObjectType):
        class Meta:
           model = FileModel
    
        storage_url = graphene.String()
    
       def resolve_storage_url(self, info):
           return f"https://bucket.s3.amazonaws.com/{self.url}"
    

    然后从前端查询storage_url 字段。

    【讨论】:

    • 是的,我想这会奏效。我希望少一些手动的东西,比如 DRF 是怎么做的
    • 如果您在进行突变时构建完整的 URL 并存储它,那将是一个更好的解决方案。您可以制作自己的标量,这需要做更多的工作。
    • 对了,你有没有尝试返回像self.image.url这样的URL?
    【解决方案2】:

    正如 Ijharul Islam 所提到的,您应该添加一个自定义字段,但是: 要从不同的存储桶,甚至是私有对象(您需要一个密钥来访问文件)获取 url,我建议访问包含文件的模型中的字段内的字段“url”。

    例如:这里我有一个自定义用户模型,在我的模型中有字段“photo_file”:

    class UserType(DjangoObjectType):
        class Meta:
            model = get_user_model()
            only_fields = ('id', 'username', 'first_name',
                           'last_name', 'photo_file',)
    
        def resolve_photo_file(self, info):
            if self.photo_file and self.photo_file.url:
                return f"{self.photo_file.url}"
    
            else:
                return None
    

    【讨论】:

      猜你喜欢
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      相关资源
      最近更新 更多