我正在尝试从Cloud Storage Bucket为我的django应用程序提供静态文件,但不知道确切的过程。有人可以建议一个正确的方法吗?
我做的步骤:
/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,)
有关此任务所需的所有其他更改的任何建议吗?
谢谢,
答案 0 :(得分:5)
主要参考文献:
必备步骤
转到GCP:云存储(GCS),然后单击CREATE BUCKET(根据需要填写)
创建后,如果您希望它像网站的CDN(存储静态文件(如CSS,图像,视频等)那样,您可以将其公开。
方法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/
在您的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。
python3 manage.py collectstatic
# or if your STATIC_ROOT folder requires permissions to write to it then:
# sudo python3 manage.py collectstatic
转到STATIC_ROOT文件夹并将其内容上载到GCS。通过GCS GUI控制台或通过Google提供的工具“ gsutil”以及rsync手动上传它们
现在,您的GCS存储桶已经包含您的静态文件,并且您的Django项目已配置为通过配置的STATIC_URL直接访问这些文件。
方法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/
[如果您使用的是Google基础架构以外的计算机,则必须执行此步骤]转到GCP:IAM,服务帐户,然后点击创建服务帐户
在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
python3 manage.py collectstatic
答案 1 :(得分:1)
基本上你需要:
检查步骤1-4 https://cloud.google.com/python/django/container-engine#deploy_the_app_to_container_engine