簡體   English   中英

如何在Heroku中使用Flask / Peewee?

[英]How to use Flask/Peewee with Heroku?

我正在嘗試將Flask應用程序部署到Heroku 我正在使用Peewee作為Postgres數據庫的ORM。 當我按照標准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數據庫交談,但沒有任何運氣。 是否有捷徑可尋? 我需要做什么來配置Flask / Peewee以便我可以在Heroku上使用db?

您正在解析DATABASE_URL環境變量嗎? 它看起來像這樣:

postgres://username:password@host: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

heroku config:設置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)

修改了coleifer的答案來回答hasenj的評論。 請將其中一個標記為已接受的答案。

我已經設法使用以下代碼獲取使用Peewee在Heroku上工作的Flask應用程序:

# 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 

然后,您可以在另一個Python腳本中導入此文件(本例中為persons.py),例如請求處理程序。 您需要顯式管理數據庫連接:

# 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

…

參考文獻:

根據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

在此示例中,peewee的db_url模塊讀取環境變量DATABASE_URL並解析它以提取相關的連接變量。 然后,它使用這些值創建PostgresqlDatabase 對象

在本地,您需要將DATABASE_URL設置為環境變量。 您可以根據您使用的任何外殼的說明執行此操作。 或者,如果要使用Heroku工具鏈(使用heroku local啟動本地服務器),可以將其添加到項目頂層的.env文件中 對於遠程設置,您需要將數據庫URL添加為遠程Heroku環境變量 您可以使用以下命令執行此操作:

heroku config:set DATABASE_URL=postgresql://myurl

您可以通過進入Heroku,導航到數據庫,然后單擊“數據庫憑據”找到該URL。 它列在URI

暫無
暫無

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

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