连接到Postgres数据库时,Apache Web服务器出现分段错误错误

时间:2020-01-24 10:53:28

标签: python linux postgresql python-2.7 apache

我有一个在apache服务器上运行的python flask网络应用。 flask应用程序只是一个函数,它返回从postgres数据库获得的值。

@app.route('/')
def hello_world():
    import psycopg2
    db_conn_string = ("dbname=" + "xxx"
                        + " user=" + "xxx"
                        + " host=" + "xxx"
                        + " password=" + "xxx")
    db_connection = psycopg2.connect(db_conn_string)
    cursor = db_connection.cursor()
    cursor.execute("SELECT * FROM XXX")
    return cursor.fetchall()

当我运行此应用程序时,我会在浏览器上找到它:

enter image description here

我检查了/var/log/apache2/error.log下的日志,错误是:

[Fri Jan 24 10:34:34.676561 2020] [core:notice] [pid 15644:tid 139639322680256] AH00051: child pid 15972 exit signal Segmentation fault (11), possible coredump in /etc/apache2

有趣的是,当我将return语句更改为仅返回一个hello world时,它运行得很好,并且看不到任何错误。因此,我的假设是该错误是由于apache Web应用程序试图连接到postgres数据库所致。我检查了数据库的凭据,那里没有错误。我不知道该如何解决。

编辑:具有相同代码的测试python程序可以工作,并且我能够检索数据。

1 个答案:

答案 0 :(得分:0)

您的视图(即hello_world函数)需要返回Flask支持的内容。也许看看Flask tutorial on Views以获得更多示例

最简单的方法是将其转换为字符串并返回,例如:

import psycopg2

@app.route('/')
def hello_world():
    con = psycopg2.connect(db_conn_string)
    with con, con.cursor() as cur:
        cur.execute("SELECT * from xxx;")
        result = cur.fetchall()
    return repr(result)

我已将您的代码重新排列为更常规的代码。请注意,import通常位于顶部。您还希望使连接字符串在顶部成为常量。使用psycopg2游标作为上下文管理器还可以将它们很好地包装在事务中,COMMIT成功执行,而ROLLBACK执行异常操作