簡體   English   中英

無法在 Google App Engine 中使用 PostgreSQL 部署 Flask-Python 應用程序

[英]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

從 App Engine 柔性環境連接到 Cloud SQL

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM