Python 3.8 DJANGO GCLOUD问题

Python 3.8 DJANGO GCLOUD issue

奇怪且令人沮丧的问题。

有两个需要托管在 Google 云上的 django 应用程序。第一个应用程序当前处于活动状态并正在提供服务,第二个应用程序不会让步。

情况如下;

两个 python 3.8 django 应用程序 两个不同的云项目,每个项目都有专用的 MySQL 8.0 个实例

当 python manage.py 在本地运行服务器(应用程序一)并激活 glcoud 第一个项目并且 CLoud_sql_proxy 正在侦听连接时,它会正确连接到 Google MySQL实例.

(开发)D:\Development>Cloud_sql_proxy.exe -instances="someinstance:europe-west2:somename"=tcp:3306 2021/04/29 13:42:08 在 127.0.0.1:3306 上监听 someinstance:europe-west2:sonam 2021/04/29 13:42:08 准备新连接

现在我正在为第二个应用程序做同样的事情(不是同时进行),激活正确的项目并且CLoud_sql_proxy根据与第二个应用程序的连接侦听连接GoogleMySQL实例。

它不会连接到 MySQL 实例,而是使用本地。

if os.getenv('GAE_APPLICATION', None):

总是正确的。

有人有什么建议吗?故障排除?也许有人经历过同样的事情?两个应用一脉相承,云配置也一样。

Setting.py

# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

import pymysql  # noqa: 402
pymysql.version_info = (1, 4, 6, 'final', 0)  # change mysqlclient version
pymysql.install_as_MySQLdb()

# Local development mode 24/04/2020
if os.getenv('GAE_APPLICATION', None):
#     Running on production App Engine, so connect to Google Cloud SQL using
#     the unix socket at /cloudsql/<your-cloudsql-connection string>
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '/cloudsql/someinstance:europe-west2:somename',
            'PORT': '3306',            
            'USER': 'admin',            
            'PASSWORD': '8t09q7OG0lx1jAy2',
            'NAME': 'bscsportaltest',
        }
    }
else:
    # Running locally so connect to either a local MySQL instance or connect to
    # Cloud SQL via the proxy. To start the proxy via command line:
    #
    #     $ cloud_sql_proxy -instances=[INSTANCE_CONNECTION_NAME]=tcp:3306
    #
    # See https://cloud.google.com/sql/docs/mysql-connect-proxy
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.sqlite3',
            'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
        }
    }

os.getenv('GAE_APPLICATION', None) 将 return None 在本地,因为默认情况下此变量在您的环境中不存在(除非您手动添加它)。在这种情况下,您的应用程序将选择 sqlite 本地数据库,因为这就是您拥有代码的方式。

如果您希望在本地连接到云 SQL 代理,那么您需要使用 HOST = localhost 的配置而不是 sqlite 配置。如下所示:

# https://docs.djangoproject.com/en/3.2/ref/settings/#databases

import pymysql  # noqa: 402
pymysql.version_info = (1, 4, 6, 'final', 0)  # change mysqlclient version
pymysql.install_as_MySQLdb()

# Local development mode 24/04/2020
if os.getenv('GAE_APPLICATION', None):
#     Running on production App Engine, so connect to Google Cloud SQL using
#     the unix socket at /cloudsql/<your-cloudsql-connection string>
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '/cloudsql/someinstance:europe-west2:somename',
            'PORT': '3306',            
            'USER': 'admin',            
            'PASSWORD': '8t09q7OG0lx1jAy2',
            'NAME': 'bscsportaltest',
        }
    }
else:
    # Running locally so connect to either a local MySQL instance or connect to
    # Cloud SQL via the proxy. To start the proxy via command line:
    #
    #     $ cloud_sql_proxy -instances=[INSTANCE_CONNECTION_NAME]=tcp:3306
    #
    # See https://cloud.google.com/sql/docs/mysql-connect-proxy
    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '127.0.0.1',
            'PORT': '3306',
            'NAME': '[YOUR-DATABASE]',
            'USER': '[YOUR-USERNAME]',
            'PASSWORD': '[YOUR-PASSWORD]',
    }
}

查看 this link 了解更多信息。