![](/img/trans.png)
[英]How to deploy Flask application in google app engine with core python packages?
[英]Unable to Deploy Flask-Python App with PostgreSQL in Google App Engine
嘗試將 Flask-Python 代碼部署到 Google App Engine 時出現錯誤。 我使用 PostgreSQL 作為我的數據庫。 這是錯誤:
Traceback (most recent call last):
File "/env/lib/python3.6/site-packages/gunicorn/arbiter.py", line 557, in spawn_worker
worker.init_process()
File "/env/lib/python3.6/site-packages/gunicorn/workers/base.py", line 126, in init_process
self.load_wsgi()
File "/env/lib/python3.6/site-packages/gunicorn/workers/base.py", line 136, in load_wsgi
self.wsgi = self.app.wsgi()
File "/env/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/env/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 65, in load
return self.load_wsgiapp()
File "/env/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load_wsgiapp
return util.import_app(self.app_uri)
File "/env/lib/python3.6/site-packages/gunicorn/util.py", line 357, in import_app
__import__(module)
File "/home/vmagent/app/main.py", line 20, in <module>
SQLAlchemy.engine.url.URL(
AttributeError: 'property' object has no attribute 'url'
[2021-01-03 14:35:46 +0000] [8] [INFO] Worker exiting (pid: 8)
[2021-01-03 14:35:46 +0000] [1] [INFO] Shutting down: Master
[2021-01-03 14:35:46 +0000] [1] [INFO] Reason: Worker failed to boot.
main.py 代碼:
from flask import Flask, redirect, url_for, render_template, request,
from flask_sqlalchemy import SQLAlchemy
import os
# Remember - storing secrets in plaintext is potentially unsafe. Consider using
# something like https://cloud.google.com/secret-manager/docs/overview to help keep
# secrets secret.
db_user = os.environ["DB_USER"]
db_pass = os.environ["DB_PASS"]
db_name = os.environ["DB_NAME"]
db_socket_dir = os.environ.get("DB_SOCKET_DIR", "/cloudsql")
cloud_sql_connection_name = os.environ["CLOUD_SQL_CONNECTION_NAME"]
pool = SQLAlchemy.create_engine(
# Equivalent URL:
# postgres+pg8000://<db_user>:<db_pass>@/<db_name>
# ?unix_sock=<socket_path>/<cloud_sql_instance_name>/.s.PGSQL.5432
SQLAlchemy.engine.url.URL(
drivername="postgresql+pg8000",
username=db_user, # e.g. "my-database-user"
password=db_pass, # e.g. "my-database-password"
database=db_name, # e.g. "my-database-name"
query={
"unix_sock": "{}/{}/.s.PGSQL.5432".format(
db_socket_dir, # e.g. "/cloudsql"
cloud_sql_connection_name) # i.e "<PROJECT-NAME>:<INSTANCE-REGION>:<INSTANCE-NAME>"
}
),
**db_config
)
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'postgres+psycopg2://postgres:<password>@<public ip>/flaskapp?host=/cloudsql/<instance name>'
app.debug = True
db = SQLAlchemy(app)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(80), unique=True)
age = db.Column(db.String(120), unique=True)
def __init__(self, name, age):
self.name = name
self.age = age
def __repr__(self):
return '<User %r>' % self.username
@app.route("/")
def home():
return render_template("home.html")
@app.route('/form')
def form():
title ="form"
return render_template("form.html", title=title)
@app.route('/success', methods=["POST"])
def success():
if request.method == 'POST':
user = User(request.form['name'],request.form['age'])
try:
db.session.add(user)
db.session.commit()
return render_template("success.html")
except:
return render_template('form.html')
else:
return redirect('/')
db.create_all()
if __name__ == "__main__":
app.run(host="127.0.0.1",port=8080, debug=True)
app.yaml 代碼:
entrypoint: "gunicorn -b:$PORT main:app"
env: flex
runtime: python
runtime_config:
python_version: 3
env_variables:
DB_USER: postgres
DB_PASS: <password>
DB_NAME: flaskapp
DB_SOCKET_DIR: /cloudsql
CLOUD_SQL_CONNECTION_NAME: <instance name>
beta_settings:
cloud_sql_instances: <instance name>
requirements.txt 代碼:
click==7.1.2
Flask==1.1.2
Flask-SQLAlchemy==2.4.4
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
psycopg2==2.8.6
SQLAlchemy==1.3.22
Werkzeug==1.0.1
gunicorn==19.6.0
這是我在部署應用程序之前使用的指南: https://cloud.google.com/sql/docs/postgres/connect-app-engine-standard 。 根據指南,我啟用了 API,安裝了雲 SDK,並為 Z3978840A0100CB30C982876741B0B5A2Z 實例創建了 Z3978841B0B5A2Z 實例。
我究竟做錯了什么? 您的幫助將不勝感激。
我檢查了您的問題,發現該教程是關於從 App Engine Standard 連接到 Cloud SQL。 但是,您的app.yaml
文件具有env: flex
。 因此,您應該決定要從哪個產品連接到 Cloud SQL。
I wrote a tutorial: "CONNECTING FROM APP ENGINE (FLEX AND STANDARD) TO CLOUD SQL USING TCP AND UNIX DOMAIN SOCKETS 2020"
如果您嘗試從 App Engine Flex 連接,請不要忘記在您的app.yaml
中包含:
啟用 Unix 域套接字
beta_settings:
cloud_sql_instances: INSTANCE_CONNECTION_NAME
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.