[英]Serve Static files from Google Cloud Storage Bucket (for Django App hosted on GCE)
I'm trying to serve the static Files for my django App from Cloud Storage Bucket but don't know the exact process.我正在尝试从 Cloud Storage Bucket 为我的 django 应用程序提供静态文件,但不知道确切的过程。 Can someone please suggest a proper way to do so ?
有人可以建议一个正确的方法吗?
Steps I did:我做的步骤:
/etc/apache2/sites-available/default-ssl.conf
File./etc/apache2/sites-available/default-ssl.conf
文件。 File Content:文件内容:
<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 File: 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,)
Any suggestion on what all additional changes are required for this task ?有关此任务需要进行哪些所有其他更改的任何建议?
Thanks,谢谢,
Main references:主要参考资料:
Prerequisite steps先决条件步骤
Go to GCP: Cloud Storage (GCS) and click on CREATE BUCKET (fill-up as needed)转到 GCP:Cloud Storage (GCS) 并单击 CREATE BUCKET(根据需要填写)
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.)创建后,如果您希望它像您网站的 CDN(存储您的静态文件,如 css、图像、视频等),您可以将其公开
Method 1 (easier and faster, but requires constant manual copying of files to the GCS)方法 1(更简单、更快,但需要不断手动将文件复制到 GCS)
# 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/
In your home.html在你的 home.html
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'home/css/home.css' %}">
Then in your home.css file然后在你的 home.css 文件中
background-image: url("../assets/img/myHandsomeImage.jpg");
The home.css link now would translate to: home.css 链接现在将转换为:
https://storage.googleapis.com/[your_bucket_name]/home/css/home.css
https://storage.googleapis.com/[your_bucket_name]/home/css/home.css
While the myHandsomeImage.jpg would be:而 myHandsomeImage.jpg 将是:
https://storage.googleapis.com/[your_bucket_name]/home/assets/img/myHandsomeImage.jpg
https://storage.googleapis.com/[your_bucket_name]/home/assets/img/myHandsomeImage.jpg
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.当然,如果你愿意,你可以只放绝对路径(完整的 URL),但这样的配置总是需要你手动更新使用的 URL,就像你切换到开发模式并只想在本地访问静态文件而不是来自 GCS。
python3 manage.py collectstatic
# or if your STATIC_ROOT folder requires permissions to write to it then:
# sudo python3 manage.py collectstatic
Go to the STATIC_ROOT folder and upload its contents to GCS.转到 STATIC_ROOT 文件夹并将其内容上传到 GCS。 Either upload them manually through the GCS GUI Console or through the Google provided tool "gsutil" along with rsync
通过 GCS GUI 控制台或通过 Google 提供的工具“gsutil”和 rsync 手动上传它们
Now, your GCS bucket already contains your static files, with your Django project configured to directly access those files through the configured STATIC_URL.现在,您的 GCS 存储桶已包含您的静态文件,您的 Django 项目已配置为通过配置的 STATIC_URL 直接访问这些文件。
Method 2 (longer, but do not require manual copying after)方法2(更长,但之后不需要手动复制)
python3 -m venv path/to/the/target/location/for/the/virtual/environment
source path/to/the/target/location/for/the/virtual/environment/bin/activate
pip3 install django-storages # https://pypi.org/project/django-storages/
pip3 install google-cloud-storage # https://pypi.org/project/google-cloud-storage/
[MANDATORY STEP if you are on a computer outside the Google Infrastructure] Go to GCP: IAM, Service Accounts, and click on CREATE SERVICE ACCOUNT [如果您使用的是 Google 基础架构之外的计算机,则必须执行的步骤] 转到 GCP:IAM,服务帐户,然后点击创建服务帐户
Configure your Django's static file settings in your settings.py在 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
python3 manage.py collectstatic
Basically you need to:基本上你需要:
Check the step 1-4 https://cloud.google.com/python/django/container-engine#deploy_the_app_to_container_engine检查步骤 1-4 https://cloud.google.com/python/django/container-engine#deploy_the_app_to_container_engine
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.