Как настроить flask -admin и flask -sqlalchemy для postgresql в Google App Engine? - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь использовать flask -admin и flask -sqlalchemy в Google App Engine, но получаю следующие ошибки:

pg8000.core.ProgrammingError: {'S ':' ERROR ',' V ':' ERROR ',' C ':' 42P18 ',' M ':' не удалось определить тип данных параметра $ 1 ',' F ':' postgres. c ',' L ':' 1400 ',' R ':' exec_parse_message '}

sqlalchemy.ex c .ProgrammingError: (pg8000.core.ProgrammingError) {' S ':' ERROR ', 'V': 'ОШИБКА', 'C': '42P01', 'M': 'отношение "пользователь" не существует', 'P': '239', 'F': 'parse_relation. c ',' L ':' 1180 ',' R ':' parserOpenTable '}

KeyError: (' SELECT count (% s) AS count_1 \ nFROM attribute ', ((705, 0, .text_out at 0x7f8a723b8c80>),))

Я получаю эти ошибки при доступе к некоторому представлению flask -admin (представление CRUD). Но когда я использую формы, отличные от flask -admin, и другие манипуляции с базой данных без flask -admin, мое приложение корректно работает в Google App Engine.

Мои настройки указаны ниже

from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
from flask_login import LoginManager
from flask_bootstrap import Bootstrap
from flask_admin import Admin

# APP setup
app = Flask(__name__)
app.config.from_object(Config)

# Databaset setup
db = SQLAlchemy(app)
migrate = Migrate(app, db)

# Bootstrap setup
bootstrap = Bootstrap(app)

# Login setup
login = LoginManager(app)
login.login_view = 'login'

from app import models


# Start Application
@app.before_first_request
def setup():

    db.create_all()

    # Creating default users, group and role
    if not models.User.query.first():

        attributes = {...}

        for k, v in attributes.items():
            attr = models.Attribute(name=k, type=v)
            db.session.add(attr)

        role = models.Role(name='admin')

        group = models.Group(name='Administrator')
        group.roles.append(role)

        user = models.User(username='admin')
        user.set_password('admin')
        user.groups.append(group)

        db.session.add(user)
        db.session.commit()


from app.views import GeneralModelView, UserModelView, RoleModelView, GroupModelView, MyAdminIndexView

# Admin Setup
admin = Admin(app, name='Administration', index_view=MyAdminIndexView())
admin.add_view(RoleModelView(models.Role, db.session))
admin.add_view(GroupModelView(models.Group, db.session))
admin.add_view(UserModelView(models.User, db.session))
admin.add_view(GeneralModelView(models.Model, db.session))
admin.add_view(GeneralModelView(models.ModelVersion, db.session))
admin.add_view(GeneralModelView(models.Attribute, db.session))


# Start Application
from app import routes

Моя конфигурация определяется следующим образом.

import os

basedir = os.path.abspath(os.path.dirname(__file__))


class Config(object):

    SECRET_KEY = os.environ.get('SECRET_KEY') or 'my-super-key-is-here'

    SQLALCHEMY_TRACK_MODIFICATIONS = False

    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URI') or \
        'sqlite:///' + os.path.join(basedir, 'app.db')

Мой app.yaml определяется ниже:

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT hub:app

runtime_config:
  python_version: 3

beta_settings:
  cloud_sql_instances: <instance>

env_variables:
  DATABASE_URI: 'postgres+pg8000://<user>:<password>?unix_sock=/cloudsql/<instance>/.s.PGSQL.5432'


manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

Пожалуйста, как я могу решить эту проблему? Все мои приложения работают, за исключением просмотров flask -admin. Мои таблицы и данные сохраняются в моей базе данных, установленной в Google Cloud SQL (PostgreSQL 11).

1 Ответ

2 голосов
/ 08 мая 2020

Я решил свои проблемы, сменив драйвер с pg8000 на psycopg2. В моем коде я просто обновляю DATABASE_URI с

postgres+pg8000://<user>:<password>@?unix_sock=/cloudsql/<instance>/.s.PGSQL.5432

до

postgres+psycopg2://<user>:<password>@/<database>?host=/cloudsql/<instance>

psycopg2 использует параметр host для получения сокетов unix и требует только путь к каталогу, а не файл как pg8000.

...