Как связать мой файл учетных данных GCS Bucket JSON в Django? - PullRequest
1 голос
/ 27 октября 2019

Я использую библиотеку Django-gcloud-storage, чтобы мое приложение Django могло сохранять изображения в GCS.

Я уже создал учетную запись, учетную запись службы GCS и загрузил ключевой файл JSON в соответствии с руководству . Однако при сохранении изображения в облачном хранилище возникает эта ошибка:

AssertionError at /showroom/create/
Credentials file not found

...

/srv/showroom/views.py in form_valid
                images.save() …
▶ Local vars
...
/env/lib/python3.7/site-packages/django_gcloud_storage/__init__.py in __init__
        assert os.path.exists(self.credentials_file_path), "Credentials file not found" …
▶ Local vars

(showroom / create - это форма загрузки).

Я сохранил свой файл учетных данных JSON в моей статической папке static/js/torque-xxx-02827c7cc0ad.json

settings.py

GCS_PROJECT = "torque-xxx"

GCS_BUCKET = "torque-xxx.appspot.com"

GCS_CREDENTIALS_FILE_PATH = os.path.join(BASE_DIR, 'static', 'js', 'torque-xxx-02827c7cc0ad.json')
# GCS_CREDENTIALS_FILE_PATH = '/static/js/torque-xxx-02827c7cc0ad.json' ## This was my first try, didn't work

# DEFAULT_FILE_STORAGE = 'google.storage.googleCloud.GoogleCloudStorage'
DEFAULT_FILE_STORAGE = 'django_gcloud_storage.DjangoGCloudStorage'

Я очень незнаком с облачным хранилищем и API, поэтому простите, если это вопрос новичка. : -)

Ответы [ 2 ]

1 голос
/ 27 октября 2019

Прямо из коробки BASE_DIR - это папка, содержащая модуль manage.py.

Проверьте, чтобы убедиться, что там есть статическая папка.

Хранение GCSФайл учетных данных в статических файлах представляет угрозу безопасности, поскольку содержит ключ учетной записи службы.

Обычно его можно хранить в других местах, к которым нет общего доступа.

ВВ соответствии с 12-факторной методологией приложения , я предлагаю настроить переменную среды и записать туда ее содержимое.

Вы можете сделать это в env_file или просто экспортировать в среду оболочки.

export GCS_CREDENTIALS=`cat /path-to-gcs-credentials-file`

Затем запишите из переменной окружения файл в папку, отличную от папки static в вашем модуле settings.

# Load environment variables from env_file if any
# https://pypi.org/project/python-dotenv/

from dotenv import load_dotenv

env_path = os.path.join(BASE_DIR, '.env')
load_dotenv(dotenv_path=env_path)


# This could be any path that the application has read/write permission to
GCS_CREDENTIALS_FILE_PATH = os.path.join(BASE_DIR, '.gcs_credentials_file') 
with open(GCS_CREDENTIALS_FILE_PATH, 'w') as f:
    f.write(os.getenv('GCS_CREDENTIALS'))

Также не забудьте пропустить .gcs_credentials_fileили любое другое имя, выбранное вами для файла из системы контроля версий.

0 голосов
/ 27 октября 2019

Все ключи Google Credentials должны храниться в переменных среды. Например, вы должны создать .env файл, подобный этому.

.env

GCS_CREDENTIALS=<your credentials key>

А затем в Django вы можетесделать что-то вроде этого

os.getenv('GCS_CREDENTIALS')

...