синтаксическая ошибка при использовании SECRET_KEY в __init__py в django - PullRequest
0 голосов
/ 23 апреля 2020

Я прочитал, что небезопасно хранить SECRET_KEY в settings.py по умолчанию. Итак, я решил сохранить его в моем __init__.py. Я написал в __init__.py, что рядом с settings.py:

export SECRET_KEY= 'hf7^vrmc!^agnpba#^+$9ac-@eullgd-=ckq&u1zu$b7nqc)%_'

Это единственная строка в моем __init__.py. Затем в settings.py я изменил строку

SECRET_KEY = 'hf7^vrmc!^agnpba#^+$9ac-@eullgd-=ckq&u1zu$b7nqc)%_'

на

SECRET_KEY = get_env_variable('SECRET_KEY')

, но при попытке запустить сервер я получаю синтаксическую ошибку, как показано ниже:

…
__init__.py", line 1
    export SECRET_KEY= 'hf7^vrmc!^agnpba#^+$9ac-@eullgd-=ckq&u1zu$b7nqc)%_'
                    ^
SyntaxError: invalid syntax

Что здесь не так? Заранее спасибо.


Я отредактировал свой код, как показано ниже, с помощью комментариев здесь, но все еще не удалось:

У меня SECRET_KEY = os.environ.get('SECRET_KEY') в settings.py, и export SECRET_KEY='hf7^vrmc!^agnpba#^+$9ac-@eullgd-=ckq&u1zu$b7nqc)%_' в .bash_profile. Это дает мне ошибку

  3.7/lib/python3.7/site-packages/django/conf/__init__.py", line 126, in init raise ImproperlyConfigured("The SECRET_KEY setting must not be empty.") django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty 

Когда я копирую файл. bash_profile из home/mydirectory и вставляю его рядом с manage.py проекта, в результате записи не возникает ошибки python manage.py runserver в терминале. (Вышеупомянутая ошибка была в терминале именно с этой командой). Но, когда я startproject из cPanel и тестирую свой веб-сайт в браузере, я получаю ошибку There is something wrong, и мой веб-сайт не работает. Я предполагаю, что происходит нечто подобное: когда я нажимаю startproject из cPanel, он начинается с внешнего root, поэтому он видит, что у меня есть два экземпляра .bash_profile. Однако, когда я go проецирую root из терминала и пишу python manage.py runserver, он просто видит, что специфицирует c .bash_profile внутри папки проекта. Это правильно? Если так, как я могу решить мою проблему, чтобы иметь безопасный SECRET_KEY с доступным веб-сайтом?

Если я удаляю внутренний .bash_profile и меняю BASE_DIR на BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) (как здесь ссылка ), у меня не будет ошибки в terminal по python manage.py runserver. Это приводит:

System check identified no issues (0 silenced). April 24, 2020 - 21:04:33 Django version 2.1, using settings 'myprojectt.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.

, и это не даст ошибку SECRET_KEY не может быть пустым. Но когда я нажимаю startproject из cPanel и go на свой домен из браузера, я получаю

`We're sorry, but something went wrong.`

Примечание: мой веб-сайт работает правильно, если я явно пишу SECRET_KEY в settings.py , НО без всякой безопасности

Ответы [ 3 ]

0 голосов
/ 23 апреля 2020

Вы можете пропустить «экспорт»:

SECRET_KEY= 'hf7^vrmc!^agnpba#^+$9ac-@eullgd-=ckq&u1zu$b7nqc)%_'
0 голосов
/ 24 апреля 2020

Наличие секретных ключей в любых файлах исходного кода проблематично c.

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

извлечение .gitignore для файлов .env и env

.env*

Мы включите python-dotenv в файл needs.txt для загрузки файла .env.

и мы загрузим переменные среды в файле .env в файле settings.py.

import os
from dotenv import load_dotenv

# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

#print('Loading environment')
#print(__file__)
env_path = os.path.join(os.path.dirname(__file__),'.env')
#print(env_path)
load_dotenv(verbose=True,dotenv_path=env_path)
0 голосов
/ 23 апреля 2020
import os   
os.environ.get('SECRET_KEY')

Требуемое объяснение: os - модуль по умолчанию для взаимодействия с операционной системой. os.environ - это словарь с переменными среды и методом get. ('SECRET_KEY') для получения значения, ключом которого является 'SECRET_KEY'. Таким образом, вы получаете значение из переменной окружения с именем 'SECRET_KEY'

Если вы используете os.environ.get ('SECRET_KEY'), то это потому, что вы ПРЕДВАРИТЕЛЬНО установили переменную окружения с именем 'SECRET_KEY'. Как я установил переменную?

возможно:

bash:

export SECRET_KEY = abcdfghijklm

или возможно:

dos:

SET SECRET_KEY = abcdfghijklm

или, возможно, в вашем редакторе / фреймворке есть параметр для установки переменной окружения.

PD БЕЗ "" или "для установки переменных среды

...