【问题标题】:Serve Static files from Google Cloud Storage Bucket (for Django App hosted on GCE)从 Google Cloud Storage Bucket 提供静态文件(用于 GCE 上托管的 Django 应用)
【发布时间】:2016-10-19 09:41:01
【问题描述】:

我正在尝试从 Cloud Storage Bucket 为我的 django 应用程序提供静态文件,但不知道确切的过程。有人可以建议一个正确的方法吗?

我做的步骤:

  1. 使用 gsutil 命令上传了 Google Cloud Storage Bucket(www.example.com) 上的所有静态文件。
  2. 已编辑/etc/apache2/sites-available/default-ssl.conf 文件。

文件内容:

<VirtualHost *:443>
        ServerName example.com
        ServerAdmin admin@example.com

 #       Alias /static /opt/projects/example-google/example_static
        Alias /static https://storage.googleapis.com/www.example.com/static
        <Directory /opt/projects/example-google/example_static>
           Require all granted
        </Directory>

        <Directory /opt/projects/example-google/example/example>
            <Files wsgi.py>
                Require all granted
            </Files>
        </Directory>

        WSGIDaemonProcess example python-path=/opt/projects/example-google/example:/opt/projects/example-google/venv/lib/python2.7/site-packages
        WSGIProcessGroup example
WSGIApplicationGroup %{GLOBAL}
        WSGIScriptAlias / /opt/projects/example-google/example/example/wsgi.py

        SSLEngine on
        SSLCertificateFile  /etc/apache2/ssl/example.com.crt
        SSLCertificateKeyFile /etc/apache2/ssl/example.com.key
        SSLCertificateChainFile /etc/apache2/ssl/intermediate.crt
</VirtualHost>

Settings.py 文件:

# Static files (CSS, JavaScript, Images)
STATIC_URL = '/static/'
# STATIC_URL = 'https://storage.googleapis.com/www.example.com/static/'
STATIC_ROOT = os.path.join(BASE_DIR, '../example_static')

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, '../example_media')
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'), MEDIA_ROOT,)

关于此任务需要进行哪些额外更改的任何建议?

谢谢,

【问题讨论】:

  • 有什么建议吗?

标签: python django static google-cloud-storage django-staticfiles


【解决方案1】:

主要参考文献:

必备步骤

  1. 转到 GCP:云存储 (GCS) 并点击 CREATE BUCKET(根据需要填写)

  2. 创建后,如果您希望它充当您网站的 CDN(存储您的静态文件,例如 css、图像、视频等),您可以将其公开


方法 1(更简单快捷,但需要不断手动将文件复制到 GCS)

  1. 在 settings.py 中配置 Django 的静态文件设置
# Tell Django about the different locations to where the static files used by the project can be found
STATICFILES_DIRS = [
    os.path.join(BASE_DIR, 'templates'),
    os.path.join(BASE_DIR, "yourapp1", "templates"),
    os.path.join(BASE_DIR, "yourapp2", "static"),
    os.path.join(BASE_DIR, "watever"),
    "/home/me/Music/TaylorSwift/",
    "/home/me/Videos/notNsfw/",
]

# If the command "collectstatic" is invoked, tell Django where to place all the collected static
# files from all the directories included in STATICFILES_DIRS. Be aware that configuring it with a
# path outside your /home/me means that you need to have permissions to write to that folder later
# on when you invoke "collectstatic", so you might need to login as root first or run it as sudo.
STATIC_ROOT = "/var/www/mywebsite/"

# Tell Django the base url to access the static files. Think of this as the "prefix" of the URL
# to where your static files are. Note that if you browse through your bucket and happen to see a
# URL such as "https://storage.cloud.google.com/<your_bucket_name>/someFileYouHaveUploaded", such
# URL requires that whoever accesses it should be currently logged-in with their Google accounts. If
# you want your static files to be publicly accessible by anyone whether they are logged-in or not,
# use the link "https://storage.googleapis.com/<your_bucket_name>/someFileYouHaveUploaded" instead.
STATIC_URL = "https://storage.googleapis.com/<your_bucket_name>/"

# References:
# https://docs.djangoproject.com/en/3.0/howto/static-files/
# https://docs.djangoproject.com/en/3.0/howto/static-files/deployment/
# https://docs.djangoproject.com/en/3.0/ref/settings/

  1. 如果您有访问其他静态文件的 HTML 文件或 CSS 文件,请确保它们使用更新后的 STATIC_URL 设置引用这些其他静态文件。

在你的 home.html 中

{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'home/css/home.css' %}">

然后在你的 home.css 文件中

background-image: url("../assets/img/myHandsomeImage.jpg");

home.css 链接现在将转换为:

https://storage.googleapis.com/[your_bucket_name]/home/css/home.css

而 myHandsomeImage.jpg 将是:

https://storage.googleapis.com/[your_bucket_name]/home/assets/img/myHandsomeImage.jpg

当然,如果您愿意,您可以只输入绝对路径(完整的 URL),但这样的配置总是需要您手动更新使用的 URL,就像您切换到开发模式并只想访问静态文件一样本地而不是来自 GCS。

  1. 在下方运行。这会将所有文件从 STATICFILES_DIRS 中的每个目录复制到 STATIC_ROOT 目录。
python3 manage.py collectstatic

# or if your STATIC_ROOT folder requires permissions to write to it then:
# sudo python3 manage.py collectstatic
  1. 转到 STATIC_ROOT 文件夹并将其内容上传到 GCS。通过 GCS GUI 控制台或通过 Google 提供的工具“gsutil”以及 rsync 手动上传它们

  2. 现在,您的 GCS 存储桶已包含您的静态文件,您的 Django 项目已配置为通过配置的 STATIC_URL 直接访问这些文件。


方法2(更长,但之后不需要手动复制)

  1. [可选步骤] 准备您的 python 虚拟环境
python3 -m venv path/to/the/target/location/for/the/virtual/environment
source path/to/the/target/location/for/the/virtual/environment/bin/activate
  1. 安装必要的包以便能够直接访问和存储到您的 GCS
pip3 install django-storages # https://pypi.org/project/django-storages/
pip3 install google-cloud-storage # https://pypi.org/project/google-cloud-storage/
  1. [如果您使用的是 Google 基础架构之外的计算机,则必须执行的步骤] 转到 GCP:IAM、服务帐户,然后点击创建服务帐户

    • 姓名:SomeName
    • ID / 电子邮件:somename
    • 角色:项目 - 所有者
    • 创建密钥,选择 JSON
    • 存储下载的 JSON 文件。一旦我们开始访问并存储到 GCS,这个生成的 json 密钥将在以后用于身份验证
    • 参考:https://cloud.google.com/docs/authentication/getting-started
  2. 在 settings.py 中配置 Django 的静态文件设置

STATICFILES_DIRS = ['same_values_as_in_method_1_above']
DEFAULT_FILE_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
GS_BUCKET_NAME = 'your_bucket_name'
STATICFILES_STORAGE = 'storages.backends.gcloud.GoogleCloudStorage'
STATIC_URL = 'https://storage.googleapis.com/<your_bucket_name>/'
from google.oauth2 import service_account
GS_CREDENTIALS = service_account.Credentials.from_service_account_file(
    'path/to/the/downloaded/json/key/credentials.json' # see step 3
)

# There are 2 ways to authenticate, you could either do 1 of the following
# 1. Define the variable GS_CREDENTIALS in the settings.py (as done above), or just
# 2. write the command "export GOOGLE_APPLICATION_CREDENTIALS='path/to/credentials.json'" in the shell where you would run the "collectstatic" command
  1. 在下方运行。这会将所有文件从 STATICFILES_DIRS 中的每个目录直接复制到您的 GCS 存储桶。这可能需要一段时间。
python3 manage.py collectstatic
  1. 现在,您的 GCS 存储桶已包含您的静态文件,您的 Django 项目已配置为通过配置的 STATIC_URL 直接访问这些文件。

【讨论】:

  • 谢谢,为什么谷歌没有关于这个的教程???他们是否希望人们通过反复试验来解决这个问题???天哪
  • 你刚刚救了我的命
【解决方案2】:

基本上你需要:

  1. 创建云存储桶并将其设置为公共可读。
  2. 本地收集静态文件
  3. 将文件复制到云存储
  4. 设置 STATIC_URL

检查步骤 1-4 https://cloud.google.com/python/django/container-engine#deploy_the_app_to_container_engine

【讨论】:

  • 您能否更具体地了解数字 4?将 STATIC_URL 设置为什么,为什么?
  • @lucemia,有没有办法在不公开文件的情况下以这种方式在 GCS 中设置静态文件?这些似乎与谷歌提供的指令相似,所以我假设静态文件应该/需要在存储桶中公开可用,但这让我考虑从存储桶下载安全文档。您是否建议在这些实例中简单地使用云存储 python 包和某种类型的 API 来收集文件,或者是否可以制作一个 googleapis url,我的应用程序可以访问但仍然不公开?
猜你喜欢
  • 1970-01-01
  • 2019-12-09
  • 2017-04-12
  • 1970-01-01
  • 2020-06-13
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2021-01-05
相关资源
最近更新 更多