是否有任何Django软件包可以为Google云端存储资源创建签名网址?

时间:2017-08-14 03:24:35

标签: django django-rest-framework google-cloud-storage

我正在使用django-rest-framework编写一个相当简单的照片应用程序,用于存储引擎的API和django-storage。前端是用Vue.js编写的。我上传部分正常工作,现在我正在尝试提供照片。当浏览器尝试从GCS加载图像时,现在看起来很明显,我只是得到了一堆403 Forbidden错误。我做了一些阅读,似乎在我的情况下最好的做法是生成在一段时间内到期的签名网址。我还没能找到这个包,这是我所希望的。除此之外,我还不清楚如何在Django中做到这一点。

4 个答案:

答案 0 :(得分:2)

是的,请查看google-cloud-storage

安装:

pip install google-cloud-storage

此外,请务必参考API Documentation,因为您需要更多内容。

希望它有所帮助!

答案 1 :(得分:1)

我最终使用to_representation中的serializers.py解决了这个问题:

from google.cloud.storage import Blob
client = storage.Client()
bucket = client.get_bucket('myBucket')

    def to_representation(self, value):
        try:
            blob = Blob(name=value.name, bucket=bucket)
            signed_url = blob.generate_signed_url(expiration=datetime.timedelta(minutes=5))
            return signed_url
        except ValueError as e:
            print(e)
            return value

答案 2 :(得分:0)

这是django 1.11中使用python3.5的有效代码。

import os
from google.oauth2 import service_account
from google.cloud import storage


class CloudStorageURLSigner(object):
    @staticmethod
    def get_video_signed_url(bucket_name, file_path):
        creds = service_account.Credentials.from_service_account_file(
            os.environ.get('GOOGLE_APPLICATION_CREDENTIALS')
        )
        bucket = storage.Client().get_bucket(bucket_name)
        blob = bucket.blob(file_path)
        signed_url = blob.generate_signed_url(
            method='PUT',
            expiration=1545367030, #epoch time
            content_type='audio/mpeg', #change_accordingly
            credentials=creds
        )
        return signed_url

答案 3 :(得分:0)

扩展@Evan Zamir的答案,而不是重新分配clientbucket,您可以从Django的default_storage获取它们(这将节省时间,因为它们已经可用)。

这是在 settings.py

from datetime import timedelta
from google.oauth2 import service_account

GS_CREDENTIALS = service_account.Credentials.from_service_account_file('credentials.json')
DEFAULT_FILE_STORAGE = "storages.backends.gcloud.GoogleCloudStorage"
GS_BUCKET_NAME = "my-bucket"
GS_EXPIRATION = timedelta(seconds=60)

serializers.py

from django.core.files.storage import default_storage
from google.cloud.storage import Blob
from rest_framework import serializers

class SignedURLField(serializers.FileField):
    def to_representation(self, value):
        try:
            blob = Blob(name=value.name, bucket=default_storage.bucket)
            signed_url = blob.generate_signed_url(expiration=default_storage.expiration)
            return signed_url
        except ValueError as e:
            print(e)
            return value

您可以像这样在序列化程序中使用此类,

class MyModelSerializer(serializers.ModelSerializer):
    file = SignedURLField()

注意:如果要签名的URL,请不要提供GS_DEFAULT_ACL = 'publicRead',因为它会创建公共URL(不会过期)