带有 graphene-django 的全媒体绝对路径
Full media absolute paths with graphene-django
我目前正在从使用 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 很陌生。所以非常感谢任何帮助。
您可以添加自定义字段来构建完整的 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
字段。
正如 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
我目前正在从使用 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 很陌生。所以非常感谢任何帮助。
您可以添加自定义字段来构建完整的 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
字段。
正如 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