Python 在Gcloud上部署Flask development server时,获取服务器错误,但由于权限原因,可以作为本地服务器正常工作
错误:sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)尝试写入只读数据库 2019-12-17 10:12:11默认值[20191217t021035][SQL:在帖子中插入(标题、发布日期、内容、用户id)值(?,,?)] 2019-12-17 10:12:11默认值[20191217t021035][参数:('hi','2019-12-17 10:12:11.435775', 嗨,3)] 2019-12-17 10:12:11默认值[20191217t021035](此错误的背景信息为:) app.yamlPython 在Gcloud上部署Flask development server时,获取服务器错误,但由于权限原因,可以作为本地服务器正常工作,python,flask,sqlalchemy,gcloud,Python,Flask,Sqlalchemy,Gcloud,错误:sqlalchemy.exc.OperationalError:(sqlite3.OperationalError)尝试写入只读数据库 2019-12-17 10:12:11默认值[20191217t021035][SQL:在帖子中插入(标题、发布日期、内容、用户id)值(?,,?)] 2019-12-17 10:12:11默认值[20191217t021035][参数:('hi','2019-12-17 10:12:11.435775', 嗨,3)] 2019-12-17 10:12:1
runtime: python37
env: standard
handlers:
- url: /main.css
static_dir: static/*
expiration: "1h"
runtime_config:
python_version: 3.7
# This configures Google App Engine to serve the files in the app's static
# directory.
#beta_settings:
# cloud_sql_instances: flask-journal:us-west1:flask-project1
entrypoint: gunicorn -b :$PORT run:app
config.py
import os
class Config:
SECRET_KEY = '[a correct key]'
SQLALCHEMY_DATABASE_URI = 'sqlite:///site.db'
# E-Mail with Flask
MAIL_SERVER = 'smtp.googlemail.com'
MAIL_PORT = 587
MAIL_USER_SSL = True
# Need to set environment variable
MAIL_USERNAME = os.environ.get('EMAIL_USER')
MAIL_PASSWORD = os.environ.get('EMAIL_PW')
MAIL_DEFAULT_SENDER = os.environ.get('EMAIL_USER')
然后,我还有一个site.db,其中包含数据库。使用后
gcloud app deploy
该网站托管,但我无法参与任何会改变数据库的操作。鉴于上面显示的错误输出,我几乎可以肯定这是一个权限错误。我看到了可以在Linux上执行chmod的解决方案,但在Windows 10上您可以执行什么操作?我猜更改数据库的“用户”现在不再允许(甚至登录)在执行操作时写入数据库
db.commit()
Google云运行时的文件系统是只读的(): 运行时包括一个完整的文件系统。文件系统是只读的,除了位置
/tmp
,该位置是一个虚拟磁盘,将数据存储在App Engine实例的RAM中
- 因此,从理论上讲,您应该能够将文件存储在
中(注意SQLAlchemy DB URI中的四个斜杠表示绝对文件路径):/tmp
- 但这意味着a)每次实例停止时,数据库都会消失b)如果将应用程序扩展到多个实例,每个实例都会有自己的数据库
- 我建议你看看谷歌云SQL上的Postgresql,看看如何从AppEngine连接到谷歌云数据库服务器。然后,配置将更改为类似以下内容:
SQLALCHEMY\u DATABASE\u URI='postgres://:@/?unix\u sock=/cloudsql//.s.PGSQL.5432'
SQLALCHEMY_DATABASE_URI = 'sqlite:////tmp/site.db'
SQLALCHEMY_DATABASE_URI = 'postgres://<db_user>:<db_pass>@/<db_name>?unix_sock=/cloudsql/<cloud_sql_instance_name>/.s.PGSQL.5432'