Вопрос по python, postgresql – Как использовать Flask / Peewee с Heroku?

4

Я пытаюсь развернутьколба приложение дляHeroku, Я используюPeewee как ORM для базы данных Postgres. Когда я следуюстандартные шаги Heroku для развертывания Flaskвеб-процесс падает после того, как я вхожуheroku ps:scale web=1, Вот что говорят логи:

Starting process with command `python app.py`
/app/.heroku/venv/lib/python2.7/site-packages/peewee.py:2434: UserWarning: Table for <class 'flask_peewee.auth.User'> ("user") is reserved, please override using Meta.db_table
cls, _meta.db_table,
Traceback (most recent call last):
File "app.py", line 167, in <module>
auth.User.create_table(fail_silently=True)
File "/app/.heroku/venv/lib/python2.7/site-packages/peewee.py", line 2518, in create_table if fail_silently and cls.table_exists():
File "/app/.heroku/venv/lib/python2.7/site-packages/peewee.py", line 2514, in table_exists return cls._meta.db_table in cls._meta.database.get_tables()
File "/app/.heroku/venv/lib/python2.7/site-packages/peewee.py", line 507, in get_tables ORDER BY c.relname""")
File "/app/.heroku/venv/lib/python2.7/site-packages/peewee.py", line 313, in execute cursor = self.get_cursor()
File "/app/.heroku/venv/lib/python2.7/site-packages/peewee.py", line 310, in get_cursor return self.get_conn().cursor()
File "/app/.heroku/venv/lib/python2.7/site-packages/peewee.py", line 306, in get_conn self.connect()
File "/app/.heroku/venv/lib/python2.7/site-packages/peewee.py", line 296, in connect self.__local.conn = self.adapter.connect(self.
database, **self.connect_kwargs)
File "/app/.heroku/venv/lib/python2.7/site-packages/peewee.py", line 199, in connect return psycopg2.connect(database=database, **kwargs)
File "/app/.heroku/venv/lib/python2.7/site-packages/psycopg2/__init__.py", line 179, in connect connection_factory=connection_factory, async=async)
psycopg2.OperationalError: could not connect to server: No such file or directory
Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Process exited with status 1
State changed from starting to crashed

Я пытался сделать несколько разных вещей, чтобы Heroku позволил моему приложению общаться с базой данных Postgres, но мне не повезло. Есть простой способ сделать это? Что мне нужно сделать, чтобы настроить Flask / Peewee, чтобы я мог использовать БД на Heroku?

Ваш Ответ

4   ответа
0

Peewee DocsВы не хотите использоватьProxy() если ваш локальный драйвер базы данных не отличается от вашего удаленного (т. е. локально, вы используете SQLite и удаленно используете Postgres). Однако если вы используете Postgres как локально, так и удаленно, это намного проще. В этом случае вы захотите изменять только значения соединения (имя базы данных, имя пользователя, пароль, хост, порт и т. Д.) Во время выполнения и не должны использоватьProxy().

Peewee имеетвстроенный парсер URL для соединений с базой данных, Вот как это использовать:

import os
from peewee import *
from playhouse.db_url import connect

db = connect(os.environ.get('DATABASE_URL'))

class BaseModel(Model):
    class Meta:
        database = db

В этом примере peewee 'sdb_url модуль читает переменную средыDATABASE_URL и анализирует его, чтобы извлечь соответствующие переменные соединения. Затем он создаетPostgresqlDatabase объект с этими ценностями.

Локально, вы хотите установитьDATABASE_URL в качестве переменной среды. Вы можете сделать это в соответствии с инструкциями любой используемой вами оболочки. Или, если вы хотите использовать набор инструментов Heroku (запустите ваш локальный сервер, используяheroku local) вы можетедобавить его в файл с именем.env at the top level of your project, Для удаленной настройки вы хотитедобавьте URL вашей базы данных в качестве удаленной переменной среды Heroku, Вы можете сделать это с помощью следующей команды:

heroku config:set DATABASE_URL=postgresql://myurl

Вы можете найти этот URL, зайдя в Heroku, перейдя в свою базу данных и нажав «Учетные данные базы данных». Это перечислено подURI.

1

в котором Peewee работает на Heroku, используя следующий код:

# persons.py

import os
from peewee import *

db_proxy = Proxy()

# Define your models here
class Person(Model):
    name = CharField(max_length=20, unique=True)
    age  = IntField()

    class Meta:
        database = db_proxy

# Import modules based on the environment.
# The HEROKU value first needs to be set on Heroku
# either through the web front-end or through the command
# line (if you have Heroku Toolbelt installed, type the following:
# heroku config:set HEROKU=1).
if 'HEROKU' in os.environ:
    import urlparse, psycopg2
    urlparse.uses_netloc.append('postgres')
    url = urlparse.urlparse(os.environ["DATABASE_URL"])
    db = PostgresqlDatabase(database=url.path[1:], user=url.username, password=url.password, host=url.hostname, port=url.port)
    db_proxy.initialize(db)
else:
    db = SqliteDatabase('persons.db')
    db_proxy.initialize(db)

if __name__ == '__main__':
    db_proxy.connect()
    db_proxy.create_tables([Person], safe=True)

У вас уже должна быть надстройка базы данных Postgres, прикрепленная к вашему приложению. Вы можете сделать это через командную строку или через веб-интерфейс. Предполагая, что база данных уже присоединена к вашему приложению, и вы уже развернули свои с вышеуказанными изменениями, войдите в Heroku и создайте таблицу (ы):

$ heroku login
$ heroku run bash
$ python persons.py

Проверьте, что таблица была создана:

$ heroku pg:psql
your_app_name::DATABASE=> \dt 

Затем вы импортируете этот файл (people.py в этом примере) в другой скрипт Python, например, обработчик запросов. Вам необходимо явно управлять подключением к базе данных:

# server.py

from flask import g
from persons import db_proxy

@app.before_request
def before_request():
    g.db = db_proxy
    g.db.connect()

@app.after_request
def after_request(response):
    g.db.close()
    return response

…

Рекомендации:

https://devcenter.heroku.com/articles/heroku-postgresql http://peewee.readthedocs.org/en/latest/peewee/database.html#dynamically-defining-a-database http://peewee.readthedocs.org/en/latest/peewee/example.html#establishing-a-database-connection https://stackoverflow.com/a/20131277/3104465 https://gist.github.com/fprieur/9561148
3

примерно так:

postgres://username:[email protected]:port/database_name

Таким образом, вы захотите извлечь это и проанализировать, прежде чем открывать соединение с вашей базой данных. В зависимости от того, как вы объявили свою базу данных (в вашей конфигурации или рядом с приложением wsgi), это может выглядеть так:

import os
import urlparse

urlparse.uses_netloc.append('postgres')
url = urlparse.urlparse(os.environ['DATABASE_URL'])

# for your config
DATABASE = {
    'engine': 'peewee.PostgresqlDatabase',
    'name': url.path[1:],
    'password': url.password,
    'host': url.hostname,
    'port': url.port,
}

Смотрите примечания здесь:https://devcenter.heroku.com/articles/django

Что делать тогда сDATABASE переменная? передать его peewee.Database () или как?
3

import os
import urlparse
import psycopg2
from flask import Flask
from flask_peewee.db import Database


if 'HEROKU' in os.environ:
    DEBUG = False
    urlparse.uses_netloc.append('postgres')
    url = urlparse.urlparse(os.environ['DATABASE_URL'])
    DATABASE = {
        'engine': 'peewee.PostgresqlDatabase',
        'name': url.path[1:],
        'user': url.username,
        'password': url.password,
        'host': url.hostname,
        'port': url.port,
    }
else:
    DEBUG = True
    DATABASE = {
        'engine': 'peewee.PostgresqlDatabase',
        'name': 'framingappdb',
        'user': 'postgres',
        'password': 'postgres',
        'host': 'localhost',
        'port': 5432 ,
        'threadlocals': True
    }

app = Flask(__name__)
app.config.from_object(__name__)
db = Database(app)

Модифицированный ответ Колейфера, чтобы ответить на комментарий Хасенджа. Пожалуйста, отметьте один из них как принятый ответ.

Похожие вопросы