python manage.py makemigrations在我的筆記本電腦上本地運行命令時,我在控制臺上收到以下錯誤:
(mywebsite) C:\Users\Sander\PycharmProjects\mywebsite>python manage.py makemigrations
Invalid line: echo DATABASE_URL=postgres://myuser:mypassword@//cloudsql/mywebsite:europe-west6:mywebsite-db/mydb > .env
Invalid line: echo GS_BUCKET_NAME=mybucket >> .env
Invalid line: echo SECRET_KEY=$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n
請注意echo [... etc. ...] > .env,當按照Google Cloud Platform 的說明在 Google Cloud Run 上部署我的 Django 網站時,這些說明實際上是我在 Google Cloud Platform 的 Secret Manager 上配置的機密內容。
現在我知道這些echo [... etc. ...] > .env指令應該創建一個檔案 .env,其中包含變數 DATABASE_URL、GS_BUCKET_NAME 和 SECRET_KEY,但它當然不會,因為它報告錯誤“無效行:...”。
我找到了這個 StackOverflow answer,指出這些 bash 指令 ( echo [... etc. ...] > .env) 根本不能由 python 執行,我可以通過從 shell 腳本運行它們來簡單地在本地執行它們,所以執行這個create-env-file.sh作業:
DATABASE_URL=postgres://myuser:mypassword@//cloudsql/mywebsite:europe-we
st6:mywebsite-db/mydb > .env
GS_BUCKET_NAME=mybucket >> .env
echo SECRET_KEY=$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n
但是,這會生成一個本地 .env 檔案,顯然我想確認使用 Secret Manager 的流程是否有效,然后再將網站移至生產環境,因為如果我保留 .env 檔案并將其上傳到生產環境,則沒有意義在仍在使用 Secret Manager 時,它不再需要了。
看后面實際運行的代碼時,這一點也變得很清楚:
import io
import os
from pathlib import Path
import environ
import google.auth
from google.cloud import secretmanager
if os.path.isfile(env_file):
# Use a local secret file, if provided
env.read_env(env_file)
elif os.environ.get("GOOGLE_CLOUD_PROJECT", None):
# Pull secrets from Secret Manager
project_id = os.environ.get("GOOGLE_CLOUD_PROJECT")
client = secretmanager.SecretManagerServiceClient()
settings_name = os.environ.get("SETTINGS_NAME", "django_settings")
name = f"projects/{project_id}/secrets/{settings_name}/versions/latest"
payload = client.access_secret_version(name=name).payload.data.decode("UTF-8")
env.read_env(io.StringIO(payload))
else:
raise Exception("No local .env or GOOGLE_CLOUD_PROJECT detected. No secrets found.")
我除錯了該代碼,問題在于 的執行env.read_env(io.StringIO(payload)),因為有效負載包含預期的內容(echo [... etc. ...] > .env行)。
我看到了使用 Google 的 Secret Manager 的優勢,但我開始認為 Django Cloud Run 教程提供的密鑰內容有問題,或者代碼決議并將其保存為環境變數。
我在 Windows 上本地運行,具有以下庫(我的內容requirements.txt):
django
# For integrating with Google Cloud Platform:
django-storages[google]>=1.12
django-environ>=0.8.1
psycopg2-binary>=2.9.1
gunicorn>=20.1.0
google-cloud-secret-manager>=2.7.2
uj5u.com熱心網友回復:
這顯然是由兩件事引起的:
在 settings.py 中,秘密內容通過 加載到環境變數中
env.read_env(io.StringIO(payload)),如問題中所述。該 read_env() 函式顯然執行以下操作:# ... for line in content.splitlines(): m1 = re.match(r'\A(?:export )?([A-Za-z_0-9] )=(.*)\Z', line) if m1: # ... elif not line or line.startswith('#'): # ignore warnings for empty line-breaks or comments pass else: logger.warning('Invalid line: %s', line) # ...由于機密內容的行以“echo”開頭,因此這些行被標記為無效(您可以在https://regex101.com上嘗試此操作),
python manage.py makemigrations因此該命令會因該錯誤而崩潰。在
payload進入之前進行編輯時env.read_env(io.StringIO(payload)),它不再以echo(解決上面專案符號中描述的問題)開頭,并且由于正則運算式匹配,也洗掉> .env或>> .env最后,第 3 行也會導致問題:SECRET_KEY=$(cat /dev/urandom | LC_ALL=C tr -dc '[:alpha:]'| fold -w 50 | head -n。讀取/dev/urandom生成偽隨機 SECRET_KEY 是 Windows 上的問題,/dev/urandom僅存在于基于 Linux 的作業系統中。
因此,如果按照部署 Django 網站的說明執行,該秘密似乎應該適用于 Google Cloud Run 基于 Linux 的生產服務器,但不適用于運行 Windows 的本地計算機。
相反,對于本地運行,做到創建.ENV檔案,無論是確實運行create-env-file.sh中的問題(*)中提到的腳本,或在同一檔案夾中settings.py手動創建.ENV檔案:
DATABASE_URL=postgres://myuser:mypassword@//cloudsql/mywebsite:europe-west6:mywebsite-db/mydb
GS_BUCKET_NAME=mybucket
SECRET_KEY=some1279Long30String5You7Create2Yourself8136
(*) /dev/urandom 當時確實對我有用,因為當我create-env_file.sh在 PyCharm 中的終端視窗上執行時,Git Bash 的新終端在我的計算機上打開,可能是因為在我的計算機上它是執行 shell 檔案的注冊程式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336373.html
