【问题标题】:Django Static - Google Cloud Storage - CDNDjango 静态 - 谷歌云存储 - CDN
【发布时间】:2020-12-31 17:35:54
【问题描述】:

在将我的 Django 静态/媒体文件提供给 Google 云存储方面我还是个新手。它现在正在工作,但我不确定这是否正确或已经足够了,我还需要使用 Cloudfront 之类的 CDN 或其他类似服务吗?我真的很困惑,任何建议都将不胜感激。

下面是我的配置。

import os
from google.oauth2 import service_account

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

GS_CREDENTIALS = service_account.Credentials.from_service_account_file(
os.path.join(BASE_DIR, 'extras/google-storage.json')
)

STATICFILES_STORAGE = 'extras.storage_backends.GoogleCloudStaticFileStorage'
DEFAULT_FILE_STORAGE = 'extras.storage_backends.GoogleCloudMediaFileStorage'

GS_PROJECT_ID = 'project_id'
GS_STATIC_BUCKET_NAME = 'static_bucket'
GS_MEDIA_BUCKET_NAME = 'media_bucket'


STATIC_URL = 'https://storage.googleapis.com/{}/'.format(GS_STATIC_BUCKET_NAME)
MEDIA_URL = 'https://storage.googleapis.com/{}/'.format(GS_MEDIA_BUCKET_NAME)
GS_DEFAULT_ACL = 'publicRead'

我正在使用以下内容:

Django 2.2

Python 3.7

非常感谢!

【问题讨论】:

    标签: django google-cloud-storage


    【解决方案1】:

    您不需要任何其他服务,例如 CDN 或 CloudFront,您的 Django 媒体就可以与 Cloud Storage 一起使用。正如官方 Django 存储文档(可访问 here)中所阐明的那样,您需要配置一些参数来集成产品,并且它不包括网络服务。

    本文here 是另一个如何集成两者以及不推荐此类服务的示例。所以,总而言之,不用担心,您不需要这种类型的网络服务来继续将您的 Django 文件运行到 Cloud Storage。

    【讨论】:

    • 感谢您的回答@gso。我还有一个问题,如果我要从 Google 云转移到 AWS S3,我的媒体需要 CDN 还是 CloudFront?
    • 嗨@aldesabido 很高兴听到它对你有帮助!根据来自 GCS 的工程师的这个回答 here,您不需要 CDN 或 CloudFront。您可以使用gsutil 命令为您执行数据的复制/传输。
    • 抱歉我的误导性问题。我的意思是当我在我的 Django 应用程序中使用 S3 而不是 GCS 时,我是否需要使用 Cloudfront?我最初的结论是:如果 GCS 不需要 CloudFront,但如果 S3 需要 Cloudfront。
    • 不用担心。不幸的是,AWS 不是我的专长。我建议您提出一个新问题,以便您可以从对此有更多了解的人那里获得答案。 :)
    【解决方案2】:

    我有同样的问题,我已经标记了它,直到我解决了所有问题。这是完整的解释,希望它对谷歌的人有所帮助:

    这是我使用谷歌存储桶的设置文件的一部分

    ## GETTING THE CREDENTIALS OF THE ACCOUNT ##
    
    from google.oauth2 import service_account
    GS_CREDENTIALS = service_account.Credentials.from_service_account_file(os.path.join(BASE_DIR,"credentials.json"))  
    
    ## STATIC FILES ##  
    
    STATICFILES_FINDERS = ('django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', )   
    
    STATICFILES_DIRS =[os.environ['STATIC_URL'],] 
    STATIC_ROOT = '/static/' 
    STATIC_URL = os.environ['STATIC_URL'] 
     
    
    #GS_STATIC_BUCKET_NAME = os.environ["GS_STATIC_BUCKET_NAME"] 
    #STATICFILES_STORAGE = "website.custom.GoogleCloudStaticStorage"  
    
    ## MEDIA FILES ##  
    GS_BUCKET_NAME = os.environ['GS_MEDIA_BUCKET_NAME'] 
    GS_PROJECT_ID = os.environ['GS_PROJECT_ID'] 
    GS_DEFAULT_ACL = 'publicRead'      
    GS_FILE_CHARSET = True #This changes the names of the files
    GS_FILE_OVERWRITE = False #no overwritting, is important, you don't know if your users have file 1.png and mess up your page
    DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'   
    MEDIA_ROOT = 'media' 
    MEDIA_URL = os.environ['MEDIA_URL'] 
    

    我会使用自定义类来存储文件,因为我知道你的技能是什么,但对我来说,没有覆盖是必须的,如果包已经这样做了,为什么还要编码它。也许是静态文件的自定义上传,因为它们确实被重写了很多,所以也许这是你可以留下的东西。

    我目前正在研究调整上传图像大小的信号,这是一个很棒的功能,因为每个项目有 5gigs 可用空间。

    希望对您有所帮助。祝你有美好的一天。

    【讨论】:

    • 感谢您的回答@jacob。我有另一个问题。您在生产中使用 uWSGI 和 Nginx 吗?
    • @aldesabido im 使用 Nginx,同谷歌应用引擎教程。
    • @aldesabido 教程行其中: # PROJECT-DIRECTORY 是带有 settings.py 和 wsgi.py 入口点的目录: gunicorn -b :$PORT website.wsgi
    • @aldesabido 抱歉之前没有回答,我不知道如何在此页面上放置通知。答案是强烈的否定。使用谷歌应用引擎,我们每个项目有几个免费的 5 gig 存储桶,我用它们将我的静态文件作为 CDN 提供服务。因此,我更喜欢处理静态 URL 而不是使用 Ngnix ......唯一的部分是,如果你没有几个本地和云的开发分支,它会搞砸开发,但我永远不会回到 Nginx
    猜你喜欢
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2023-02-08
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 2016-10-12
    相关资源
    最近更新 更多