Apache Ошибка сегментации веб-сервера при подключении к Postgres базе данных - PullRequest
0 голосов
/ 24 января 2020

У меня есть python flask веб-приложение, работающее на apache сервере. Приложение 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, чтобы просто вернуть привет мир он работает просто отлично, и я не вижу никакой ошибки. Поэтому я предполагаю, что ошибка связана с тем, что веб-приложение apache пытается подключиться к базе данных postgres. Я проверил учетные данные базы данных, и в этом нет ничего плохого. Я не знаю, как это исправить.

РЕДАКТИРОВАТЬ : тестовая программа python с тем же кодом работает, и я могу получить данные.

1 Ответ

0 голосов
/ 24 января 2020

ваше представление (то есть функция hello_world) должно возвращать то, что поддерживается Flask. возможно, посмотрите на учебник Flask по представлениям , чтобы получить больше примеров

, проще всего было бы просто преобразовать это в строку и вернуть ее, например:

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 s обычно go вверху. Вы также хотели бы сделать строку подключения постоянной в верхней части. использование psycopg2 курсоров в качестве диспетчера контекста также прекрасно оборачивает их в транзакции, COMMIT в случае успеха и ROLLBACK в исключительной ситуации

...