Проблема Python 3.8 DJANGO GCLOUD

Странная и неприятная проблема.

Имейте два приложения django, которые должны быть размещены в Google Cloud. Первое приложение в настоящее время активно и обслуживается, второе приложение не сдастся.

Ситуация следующая;

Два приложения django на Python 3.8. Два разных облачных проекта с выделенным экземпляром MySQL 8.0.

Когда python manage.py runserver (приложение one) локально с активированным первым проектом glcoud и CLoud_sql_proxy для прослушивания соединений, он правильно подключается к экземпляру Google MySQL.

(Разработка) D:\Development›Cloud_sql_proxy.exe -instances=someinstance:europe-west2:somename=tcp:3306 29.04.2021 13:42:08 Прослушивание на 127.0.0.1:3306 для someinstance:europe-west2:somenam 29.04.2021 13:42:08 Готов к новым подключениям

Теперь я делаю то же самое для второго приложения (не одновременно), правильно активировал проект и CLoud_sql_proxy для прослушивания соединений на основе соединения со вторым экземпляром Google MySQL.

Он не будет подключаться к экземпляру MySQL, вместо этого используется локальный.

если os.getenv('GAE_APPLICATION', нет):

всегда верно.

У кого-нибудь есть советы? Исправление проблем? Может кто-то сталкивался с подобным? Два приложения работают по одному принципу, а облачная конфигурация одинакова.

Настройка.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'),
        }
    }


person Mark1982    schedule 29.04.2021    source источник
comment
os.getenv('GAE_APPLICATION', None): вернет None локально, поскольку эта переменная не существует в вашей среде по умолчанию (если вы не добавили ее вручную). В этом случае ваше приложение выберет локальную базу данных sqlite, так как у вас есть код. Не могли бы вы объяснить, чего именно вы ожидаете? Если вы планируете подключаться к Cloud SQL Proxy локально, вам нужна конфигурация с HOST = localhost вместо конфигурации sqlite.   -  person dishant makwana    schedule 29.04.2021
comment
Взгляните на: cloud.google.com/python/django/appengine.   -  person dishant makwana    schedule 29.04.2021


Ответы (1)


os.getenv('GAE_APPLICATION', None) вернет None локально, поскольку эта переменная не существует в вашей среде по умолчанию (если вы не добавили ее вручную). В этом случае ваше приложение выберет локальную базу данных sqlite, так как у вас есть код.

Если вы планируете подключаться к Cloud SQL Proxy локально, вам нужно иметь конфигурацию с 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]',
    }
}

Взгляните на эту ссылку для получения дополнительной информации.

person dishant makwana    schedule 29.04.2021
comment
Я предположил, что облачный прокси Google влияет на это условие. Так что же влияет на вывод GAE_APPLICATION? Тот факт, что он работает в движке приложения Google? Как моя локальная среда узнает, что это так? Явно там что-то не так. Как уже упоминалось, у меня есть еще одно веб-приложение, которое локально подключается к экземпляру Google MySql. - person Mark1982; 01.05.2021
comment
Вывод GAE_APPLICATION — это тот факт, что он работает на движке приложения. Вы можете вывести значение на стандартный вывод и посмотреть, что это такое. Тот факт, что запущен прокси-сервер Cloud SQL, не влияет на обнаружение django переменной среды GAE_APPLICATION. Кроме того, похоже, вы немного не знаете, как использовать Cloud SQL Proxy. Я бы посоветовал вам попробовать запустить код, которым я поделился, а также сравнить его с кодом приложения, которое уже работает, как и ожидалось, чтобы понять, что вы делаете неправильно. - person dishant makwana; 02.05.2021