[英]How do I make this flask app suitable for Google Cloud Engine?
[英]How do I upgrade an old Django Google App Engine application to a Second Generation Cloud SQL Instance?
我有一个 5 年前编写的 Django 应用程序,它已在 Google App Engine 上成功运行 - 直到上个月 Google 升级到第二代云 SQL。
目前,我有一个 settings.py 文件,其中包含一个如下所示的数据库定义:
DATABASES = {
'default': {
'ENGINE': 'google.appengine.ext.django.backends.rdbms',
'INSTANCE': 'my-project-name:my-db-instance',
'NAME': 'my-db-name',
},
Google 的升级指南告诉我连接名称需要从“my-project-name:my-db-instance”更改为“my-project-name:my-region:my-db-instance”。 这很简单。 改变这会导致我得到错误
/login/ 处的内部错误
(0, u'无权访问实例:my-project-name:my-region:my-db-instance')
根据这个问题,我需要在我的实例名称中添加前缀“/cloudsql/”。 所以,我改变了这个(和引擎规范)给:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'INSTANCE': '/cloudsql/my-project-name:my-region:my-db-instance',
'NAME': 'my-db-name',
'USER' : 'root',
'PASSWORD': '******************',
},
我将修改后的文件上传到 Google(使用 gcloud app deploy)。 这次我得到一个完全不同的错误屏幕,显示:
错误:服务器错误
服务器遇到错误,无法完成您的请求。
请在 30 秒后重试。
当我查看日志时,我看到:
配置不当:加载 MySQLdb 模块时出错:没有名为 MySQLdb 的模块
Daniel Ocando在这个问题中指出,“rdbms 库将无法与升级的第二代云 SQL 实例一起使用”。 现在需要通过 Unix 域套接字连接到数据库。
Google 提供了有关如何执行此操作的文档和示例。 但是,我不觉得谷歌的说明很有帮助。 为了连接 Python 应用程序,他们给出了这个示例代码:
main.py:
db = sqlalchemy.create_engine(
sqlalchemy.engine.url.URL(
drivername="mysql+pymysql",
username=db_user,
password=db_pass,
database=db_name,
query={"unix_socket": "/cloudsql/{}".format(cloud_sql_connection_name)},
),
)
我的应用程序没有 main.py 文件,所以我真的不确定将这段代码放在哪里。 我已经在 GitHub 中查看了完整的示例代码,但是对于我需要在我的 settings.py 文件或我的应用程序的其他地方进行哪些更改,我并不知道。
My question is: Do I really have to go down this route (shifting to use SQLalchemy library), or can I upgrade my Django app to work with a second generation Google cloud SQL instance simply by making some changes in my settings.py file? 如果是这样,有什么变化?
我的应用程序使用 Django 1.4、Python 2.7,而我没有使用 Google 建议的 Flask 框架。
5 年前,我学会使用 Django 纯粹是为了编写这个应用程序,但从那以后我就再也没有使用过它——所以我几乎忘记了我所知道的关于 Django 和 ZA7F5F35426B92741117231B5638 的一切。
在我开始之前这里有几点注意事项:Django 1.4 和 Python 2.7 不再受支持,因此此配置可能有效,也可能无效。
在您介绍 SQLAlchemy 指令的部分之前,您一直走在正确的轨道上。 这些不是 Django 配置。 如果您完成以下步骤,您应该能够保留当前的DATABASES
语法:
app.yaml
以允许您的新数据库。Cloud SQL Client
(首选)权限设置为 App Engine 服务帐号。mysqlclient
作为 Python 依赖项。App Engine Flex 指南上的 Django使用 PostgreSQL,但确实包含了一些应该有用的MySQL 特定建议。 那里还有示例数据库配置。
希望这可以帮助!
非常感谢glasnt提供的有用建议。 这些让我走上了正确的轨道,再加上我在其他地方找到的一些信息,我让我的网站重新启动并再次运行——这让我的客户非常高兴!
以下是我必须更改的详细信息:
我更新了我的 app.yaml 文件并添加了:
beta_settings:
cloud_sql_instance: "my-project-name:my-region:my-db-instance"
并且:
libraries:
- name: MySQLdb
version: "latest"
我更新了 settings.py,并添加了:
import MySQLdb
我将 DATABASES 定义更新为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'HOST': '/cloudsql/my-project-name:my-region:my-db-instance',
'NAME': 'my-db-name',
'USER' : 'root',
'PASSWORD': 'my-db-password',
},
我发现我不需要为 App Engine Service 帐户设置任何权限。 谷歌的升级指南,指出:
当您将具有授权 App Engine 项目的实例从第一代升级到第二代时,Cloud SQL 会创建一个特殊服务帐号,该帐号提供与升级前授权 App Engine 项目相同的访问权限。 由于此服务帐户仅授权访问特定实例,而不是整个项目,因此此服务帐户在 IAM 服务帐户页面中不可见,您无法更新或删除它。
因此,对于迁移的第一代应用程序,无需配置权限。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.