5

FlaskアプリをHerokuにデプロイしようとしています。Postgres データベースの ORM としてPeeweeを使用しています。Herokuの標準的な手順に従ってFlask をデプロイすると、 に入ると Web プロセスがクラッシュします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 データベースと通信できるようにするために、さまざまなことを試しましたが、うまくいきませんでした。これを行う簡単な方法はありますか?Heroku でデータベースを使用できるように Flask/Peewee を構成するにはどうすればよいですか?

4

4 に答える 4

4

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 のdb_urlモジュールが環境変数DATABASE_URLを読み取って解析し、関連する接続変数を抽出します。次に、それらの値を持つPostgresqlDatabase オブジェクトを作成します。

ローカルではDATABASE_URL、環境変数として設定する必要があります。これは、使用しているシェルの指示に従って行うことができます。または、 Heroku ツールチェーンを使用する場合heroku local( . リモート設定の場合、データベース URL をリモート Heroku 環境変数として追加する必要があります。これは、次のコマンドで実行できます。.env

heroku config:set DATABASE_URL=postgresql://myurl

その URL を見つけるには、Heroku に移動し、データベースに移動して、[データベースの資格情報] をクリックします。の下にリストされていURIます。

于 2017-07-23T16:31:46.073 に答える
3

heroku config:set HEROKU=1

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)

hasenj のコメントに答えるように coleifer の回答を修正しました。これらのいずれかを承認済みの回答としてマークしてください。

于 2013-11-21T20:31:31.153 に答える
3

DATABASE_URL 環境変数を解析していますか? 次のようになります。

postgres://username:password@host:port/database_name

したがって、データベースへの接続を開く前に、それを取得して解析する必要があります。データベースをどのように宣言したか (config または 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

于 2012-05-28T14:58:39.277 に答える
2

以下のコードを使用して、Peewee を使用する Flask アプリを 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 データベース アドオンが既にアタッチされている必要があります。これは、コマンド ラインまたは Web フロントエンドから実行できます。データベースが既にアプリにアタッチされており、上記の変更で既にデプロイされていると仮定して、Heroku にログインし、テーブルを作成します。

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

テーブルが作成されたことを確認します。

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

次に、このファイル (この例では persons.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

…

参考文献:

于 2015-06-17T15:38:48.727 に答える