从Google Cloud Storage Bucket提供静态文件(适用于GCE上托管的Django应用) [英] Serve Static files from Google Cloud Storage Bucket (for Django App hosted on GCE)

查看:98
本文介绍了从Google Cloud Storage Bucket提供静态文件(适用于GCE上托管的Django应用)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to serve the static Files for my django App from Cloud Storage Bucket but don't know the exact process. Can someone please suggest a proper way to do so ?

我执行的步骤:


  1. 上传Google Cloud Storage上的所有静态文件使用gsutil命令存储桶(www.example.com)。

  2. 编辑 /etc/apache2/sites-available/default-ssl.conf 文件。

  1. Uploaded all the static files on Google Cloud Storage Bucket(www.example.com) using gsutil command.
  2. Edited /etc/apache2/sites-available/default-ssl.conf File.

文件内容:

<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文件:

Settings.py File:

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

关于此任务需要进行所有其他更改的任何建议?

Any suggestion on what all additional changes are required for this task ?

谢谢,

推荐答案

主要参考文献:

  • https://django-storages.readthedocs.io/en/latest/backends/gcloud.html
  • https://medium.com/@umeshsaruk/upload-to-google-cloud-storage-using-django-storages-72ddec2f0d05

前提步骤


  1. 转到GCP:云存储(GCS ),然后点击创建桶(根据需要填充)

  1. Go to GCP: Cloud Storage (GCS) and click on CREATE BUCKET (fill-up as needed)

创建后,如果您希望它像您的CDN一样就可以将其公开网站(存储静态文件,例如CSS,图像,视频等)

Once created, you can make it public if you want it to act like a CDN of your website (storage of your static files such as css, images, videos, etc.)

  • Go to your newly created bucket
  • Go to Permissions and then Click Add members
  • Add a new member "allUsers" with role "Cloud Storage - Storage Object Viewer"
  • Reference: https://cloud.google.com/storage/docs/quickstart-console



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


  1. 在settings.py中配置Django的静态文件设置。py



# 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

In your home.html

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

然后在home.css文件中

Then in your home.css file

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

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

The home.css link now would translate to:


https://存储.googleapis.com / [your_bucket_name] /home/css/home.css

虽然myHandsomeImage.jpg是:

While the myHandsomeImage.jpg would be:


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

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

Of course if you wish, you could just put the absolute path (complete URL), but such configuration would always require you to update the used URLs manually, like if you switched to development mode and wanted to just access the static files locally instead of from 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手动上传它们

  1. Go to the STATIC_ROOT folder and upload its contents to GCS. Either upload them manually through the GCS GUI Console or through the Google provided tool "gsutil" along with rsync

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

Now, your GCS bucket already contains your static files, with your Django project configured to directly access those files through the configured 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,服务帐户,然后点击创建服务帐户

  1. [MANDATORY STEP if you are on a computer outside the Google Infrastructure] Go to GCP: IAM, Service Accounts, and click on CREATE SERVICE ACCOUNT

  • Name: SomeName
  • ID / email: somename
  • Role: Project - Owner
  • CREATE KEY, select JSON
  • Store the downloaded JSON file. This generated json key would be used later for authentication purposes once we start accessing and storing to the GCS
  • Reference: https://cloud.google.com/docs/authentication/getting-started

在settings.py

Configure your Django's static file settings in your settings.py



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直接访问这些文件。

这篇关于从Google Cloud Storage Bucket提供静态文件(适用于GCE上托管的Django应用)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆