使用 Django 配置 Google Cloud App Engine

如何解决使用 Django 配置 Google Cloud App Engine

我正在关注此tutorial 使用 Google Cloud 部署 Django。在时间戳 (13:39),他在 VS Code 中进入 Django 项目中的 settings.py,并将一些占位符替换为他自己的 Google Cloud 凭据。然而,我的 settings.py 看起来非常不同。块帽中唯一看起来像是占位符的东西是“GOOGLE_CLOUD_PROJECT”和“SETTINGS_NAME”。这是我无法通过的安装部分,因为在下一步尝试执行时

python manage.py makemigrations

我被送到这里:

else:
    raise Exception("No local .env or GOOGLE_CLOUD_PROJECT detected. No secrets found.")

希望有人能浏览一下我的 settings.py 并找出我遗漏的内容,为什么 if 块会出现 Exception

需要注意的一点:顶级导入environgoogle.cloud 未解析。 idk是否与它有关。这就是文件从罐中出来的方式。我不想惹它,以防万一 tshtf :D

settings.py

import io
import os

import environ
from google.cloud import secretmanager

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

# [START gaestd_py_django_secret_config]
env = environ.Env(DEBUG=(bool,False))
env_file = os.path.join(BASE_DIR,".env")

if os.path.isfile(env_file):
    # Use a local secret file,if provided

    env.read_env(env_file)
# [START_EXCLUDE]
elif os.getenv("TRAMPOLINE_CI",None):
    # Create local settings if running with CI,for unit testing

    placeholder = (
        f"SECRET_KEY=a\n"
        f"DATABASE_URL=sqlite://{os.path.join(BASE_DIR,'db.sqlite3')}"
    )
    env.read_env(io.StringIO(placeholder))
# [END_EXCLUDE]
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.")
# [END gaestd_py_django_secret_config]

SECRET_KEY = env("SECRET_KEY")

# Security WARNING: don't run with debug turned on in production!
# Change this to "False" when you are ready for production
DEBUG = True

# Security WARNING: App Engine's security features ensure that it is safe to
# have ALLOWED_HOSTS = ['*'] when the app is deployed. If you deploy a Django
# app not on App Engine,make sure to set an appropriate host here.
ALLOWED_HOSTS = ["*"]

# Application deFinition

INSTALLED_APPS = [
    "polls.apps.PollsConfig","django.contrib.admin","django.contrib.auth","django.contrib.contenttypes","django.contrib.sessions","django.contrib.messages","django.contrib.staticfiles",]

MIDDLEWARE = [
    "django.middleware.security.SecurityMiddleware","django.contrib.sessions.middleware.SessionMiddleware","django.middleware.common.CommonMiddleware","django.middleware.csrf.CsrfViewMiddleware","django.contrib.auth.middleware.AuthenticationMiddleware","django.contrib.messages.middleware.MessageMiddleware","django.middleware.clickjacking.XFrameOptionsMiddleware",]

ROOT_URLconf = "mysite.urls"

TEMPLATES = [
    {
   "BACKEND": "django.template.backends.django.DjangoTemplates","Dirs": [],"APP_Dirs": True,"OPTIONS": {
        "context_processors": [
            "django.template.context_processors.debug","django.template.context_processors.request","django.contrib.auth.context_processors.auth","django.contrib.messages.context_processors.messages",],},]

Wsgi_APPLICATION = "mysite.wsgi.application"

# Database
# [START db_setup]
# [START gaestd_py_django_database_config]
# Use django-environ to parse the connection string
DATABASES = {"default": env.db()}

# If the flag as been set,configure to use proxy
if os.getenv("USE_CLOUD_sql_AUTH_PROXY",None):
    DATABASES["default"]["HOST"] = "127.0.0.1"
    DATABASES["default"]["PORT"] = 5432

# [END gaestd_py_django_database_config]
# [END db_setup]

# Use a in-memory sqlite3 database when testing in CI systems
# Todo(glasnt) CHECK IF THIS IS required because we're setting a val above
if os.getenv("TRAMPOLINE_CI",None):
    DATABASES = {
        "default": {
            "ENGINE": "django.db.backends.sqlite3","NAME": os.path.join(BASE_DIR,"db.sqlite3"),}
    }

# Password validation

AUTH_PASSWORD_VALIDATORS = [
    {
        "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator",# noqa: 501
    },{
        "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator",{
        "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator",{
        "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator",]

# Internationalization

LANGUAGE_CODE = "en-us"
TIME_ZONE = "UTC"
USE_I18N = True
USE_L10N = True
USE_TZ = True

# Static files (CSS,JavaScript,Images)

STATIC_ROOT = "static"
STATIC_URL = "/static/"
STATICFILES_Dirs = []

# Default primary key field type
# https://docs.djangoproject.com/en/3.2/ref/settings/#default-auto-field

DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"

解决方法

Django 希望您提供一个 SECRET_KEY。有多种方法可以提供此类密钥,但一种方法是在 .env 文件所在的同一文件夹中创建一个包含 SECRET_KEYmanage.py 文件。

可以使用以下 code snippet 生成 SECRET_KEY(在您认为方便的任何地方运行它,但不要将生成的密钥字符串添加到您的 {{1} } 文件):

settings.py

获取结果输出(它是一个 50 个字符长的字符串)并将其添加到 from django.core.management.utils import get_random_secret_key get_random_secret_key() 文件中,格式如下:

.env

您可能还需要将 SECRET_KEY="the-50-character-string-here" 文件中的 BASE_DIR 替换为以下内容才能正确加载 settings.py 文件(注意第一行是如何注释掉的)。

.env

在与数据库设置相关的过程中,您可能会遇到更多问题。查看 thisthis SO 问题。

您还可以考虑查看 Guide,这是您所指的教程所遵循的内容。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?