有没有Django包可以为Google云存储资源创建签名URL?

有没有Django包可以为Google云存储资源创建签名URL?,django,django-rest-framework,google-cloud-storage,Django,Django Rest Framework,Google Cloud Storage,我正在编写一个相当简单的照片应用程序,使用django rest框架作为API,使用django存储作为存储引擎。前端是用Vue.js编写的。我有上传部分的工作,现在我正试图提供的照片。现在看来,当浏览器试图从GCS加载图像时,很明显,我只收到了403个禁止的错误。我对此做了一些阅读,在我的案例中,似乎最好的做法是生成在一定时间内过期的签名URL。我还没有找到一个包裹,这正是我所希望的。除此之外,我还不清楚如何在Django做到这一点。是的,请看 安装: pip install google-c

我正在编写一个相当简单的照片应用程序,使用django rest框架作为API,使用django存储作为存储引擎。前端是用Vue.js编写的。我有上传部分的工作,现在我正试图提供的照片。现在看来,当浏览器试图从GCS加载图像时,很明显,我只收到了403个禁止的错误。我对此做了一些阅读,在我的案例中,似乎最好的做法是生成在一定时间内过期的签名URL。我还没有找到一个包裹,这正是我所希望的。除此之外,我还不清楚如何在Django做到这一点。

是的,请看

安装:

pip install google-cloud-storage
另外,当你需要更多的东西时,一定要参考


希望有帮助

我最终通过在
serializers.py
中使用
to_表示法解决了这个问题:

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

这是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

扩展@Evan Zamir的答案,而不是重新分配
客户端
存储桶
,您可以从Django的
默认存储
(这将节省时间,因为它们已经可用)

这在设置中。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)
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
在序列化程序中.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)
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(不会过期)时需要签名url,请不要提供
GS\u DEFAULT\u ACL='publicRead'

我在其中找到了一个名为
generate\u signed\u url
的函数,这正是我需要的。您建议在django rest框架应用程序中的何处使用此选项?我正在考虑在
视图中使用它。py
。@EvanZamir取决于您的情况。如果它是该视图特定的,则不应是views.py。如果它是某些业务逻辑的一部分,您可能希望将其放在模型方法中。请查看以下内容:。我放弃了最初的回购协议,做了一些改变。我将代码作为服务放在django应用程序中这对我来说很有效,但我删除了方法和内容类型