如何在 Heroku 中使用 Flask/Peewee?

Jac*_*890 5 python deployment postgresql heroku flask

我正在尝试将Flask应用程序部署到Heroku。我使用Peewee作为 Postgres 数据库的 ORM。当我按照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
Run Code Online (Sandbox Code Playgroud)

我尝试了很多不同的方法来让 Heroku 允许我的应用程序与 Postgres 数据库对话,但没有任何运气。是否有捷径可寻?我需要做什么来配置 Flask/Peewee 以便我可以在 Heroku 上使用数据库?

Mic*_*ano 5

根据Peewee 文档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
Run Code Online (Sandbox Code Playgroud)

在这个例子中,peewee的db_url模块读取环境变量DATABASE_URL并解析它以提取相关的连接变量。然后它用这些值创建一个PostgresqlDatabase 对象。

在本地,您需要将其设置DATABASE_URL为环境变量。您可以根据您所使用的任何 shell 的说明来执行此操作。或者,如果您想使用 Heroku 工具链(使用 启动本地服务器heroku local),您可以将其添加到项目顶层名为 的文件中.env。对于远程设置,您需要将数据库 URL 添加为远程 Heroku 环境变量。您可以使用以下命令来执行此操作:

heroku config:set DATABASE_URL=postgresql://myurl
Run Code Online (Sandbox Code Playgroud)

您可以通过进入 Heroku、导航到您的数据库并单击“数据库凭据”来找到该 URL。它列在 下URI


col*_*fer 3

您正在解析 DATABASE_URL 环境变量吗?它看起来像这样:

postgres://username:password@host:port/database_name
Run Code Online (Sandbox Code Playgroud)

因此,在打开与数据库的连接之前,您需要将其拉入并解析它。根据您声明数据库的方式(在您的配置中或在 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,
}
Run Code Online (Sandbox Code Playgroud)

请参阅此处的注释:https://devcenter.heroku.com/articles/django