从Google Cloud Storage Bucket提供静态文件(适用于GCE上托管的Django App)

时间:2016-10-19 09:41:01

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

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

我做的步骤:

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

    <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,)
    

    有关此任务所需的所有其他更改的任何建议吗?

    谢谢,

2 个答案:

答案 0 :(得分:5)

主要参考文献:

必备步骤

  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,服务帐户,然后点击创建服务帐户

  2. 在settings.py

  3. 中配置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直接访问这些文件。

答案 1 :(得分:1)

基本上你需要:

  1. 创建云存储桶并将其设置为公共可读。
  2. 收集静态文件本地
  3. 将文件复制到云端存储
  4. 设置STATIC_URL
  5. 检查步骤1-4 https://cloud.google.com/python/django/container-engine#deploy_the_app_to_container_engine