pgAdmin4 перестал работать после последнего обновления Ubuntu 16.04. У объекта ‘Request’ отсутствует атрибут ‘is_json’

Вопрос или проблема

pgadmin4 работал отлично до обновления системы ubuntu 16.04, я на самом деле не проверял, какие были эти обновления.

Но после обновления, когда я попытался запустить pgAdmin, он загружается и показывает экран загрузки pgAdmin. Затем он долго загружается и в конечном итоге выдает мне ошибку:

Не удалось связаться с сервером приложения.

Я проверил логи pgAdmin4, и он показывает:

AttributeError: 'Request' object has no attribute 'is_json'
2020-05-18 16:08:46,684: ERROR  pgadmin:  'Request' object has no attribute 'is_json'
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1473, in full_dispatch_request
    rv = self.preprocess_request()
  File "/usr/lib/python3/dist-packages/flask/app.py", line 1666, in preprocess_request
    rv = func()
  File "/usr/lib/python3/dist-packages/flask_principal.py", line 477, in _on_before_request
    identity = loader()
  File "/usr/lib/python3/dist-packages/flask_security/core.py", line 515, in _identity_loader
    if not isinstance(current_user._get_current_object(), AnonymousUserMixin):
  File "/usr/lib/python3/dist-packages/werkzeug/local.py", line 307, in _get_current_object
    return self.__local()
  File "/usr/lib/python3/dist-packages/flask_login/utils.py", line 26, in <lambda>
    current_user = LocalProxy(lambda: _get_user())
  File "/usr/lib/python3/dist-packages/flask_login/utils.py", line 302, in _get_user
    current_app.login_manager._load_user()
  File "/usr/lib/python3/dist-packages/flask_login/login_manager.py", line 313, in _load_user
    return self._load_from_request(request)
  File "/usr/lib/python3/dist-packages/flask_login/login_manager.py", line 370, in _load_from_request
    user = self.request_callback(request)
  File "/usr/lib/python3/dist-packages/flask_security/core.py", line 475, in _request_loader
    if request.is_json:
  File "/usr/lib/python3/dist-packages/werkzeug/local.py", line 348, in __getattr__
    return getattr(self._get_current_object(), name)
AttributeError: 'Request' object has no attribute 'is_json'

Я уже пытался искать решение, но я не специалист по python. Мое предположение — это несовместимость версий python. Я видел предыдущий вопрос по этому поводу 4 дня назад. И он был удален. Я не уверен, почему.

Примечание: Изменений в конфигурации или чем-либо другом нет.

ИЗМЕНЕНИЕ (спасибо комментарию @Des Magner):
Этот баг уже отслеживается командой PostgreSQL https://redmine.postgresql.org/issues/5565

Появилась та же проблема.

Мое решение не лучшее и не самое простое, но оно работает.

Я создал новую виртуальную среду с python 3.8 и попробовал запустить PgAdmin. Конечно, это не удалось из-за отсутствующих модулей python.
Поэтому я установил модуль и снова запустил PgAdmin из терминала (так: “python3 /usr/share/pgadmin4/web/pgAdmin4.py”) снова и снова…

Пока не столкнулся с проблемой импорта ImportError: cannot import name 'default_render_json' from 'flask_security.views'

Решение здесь, и оно довольно простое
https://forums.opensuse.org/showthread.php/539523-pgAdmin4-startet-nicht-mehr?s=75392d29ead60bd332ff6f2541467dba&p=2930160#post2930160

Также вам нужно установить libpq, чтобы скомпилировать psycopg2.

Вкратце, мои шаги следующие:

  1. sudo apt install libpq-dev
  2. активировать виртуальную среду с python 3.8
  3. pip install -r pip_freeze_output_file.txt
  4. исправить ImportError: cannot import name ‘default_render_json’

Вывод pip freeze:

alembic==1.4.2
astroid==2.3.3
Babel==2.8.0
backcall==0.1.0
bcrypt==3.1.7
blinker==1.4
Brotli==1.0.7
cffi==1.14.0
click==7.1.2
cryptography==2.9.2
decorator==4.4.2
dnspython==1.16.0
email-validator==1.1.1
entrypoints==0.3
Flask==1.1.2
Flask-BabelEx==0.9.4
Flask-Compress==1.5.0
Flask-Gravatar==0.5.0
Flask-Login==0.5.0
Flask-Mail==0.9.1
Flask-Migrate==2.5.3
Flask-Paranoid==0.2.0
Flask-Principal==0.4.0
Flask-Security==3.0.0
Flask-SQLAlchemy==2.4.1
Flask-WTF==0.14.3
future==0.18.2
idna==2.9
ipython==7.13.0
ipython-genutils==0.2.0
isort==4.3.21
itsdangerous==1.1.0
jedi==0.16.0
Jinja2==2.11.2
lazy-object-proxy==1.4.3
ldap3==2.7
Mako==1.1.2
MarkupSafe==1.1.1
mccabe==0.6.1
paramiko==2.7.1
parso==0.6.2
passlib==1.7.2
pexpect==4.8.0
pickleshare==0.7.5
prompt-toolkit==3.0.5
psutil==5.7.0
psycopg2==2.8.5
ptyprocess==0.6.0
pyasn1==0.4.8
pycodestyle==2.5.0
pycparser==2.20
pyflakes==2.1.1
Pygments==2.6.1
pylint==2.4.4
PyNaCl==1.3.0
python-dateutil==2.8.1
python-editor==1.0.4
pytz==2020.1
simplejson==3.17.0
six==1.14.0
speaklater==1.3
SQLAlchemy==1.3.17
sqlparse==0.3.1
sshtunnel==0.1.5
traitlets==4.3.3
urllib3==1.25.8
wcwidth==0.1.9
Werkzeug==1.0.1
wrapt==1.11.2
WTForms==2.3.1

Установите последнюю версию pgAdmin4 (4.22) с использованием их python-wheel установщика (требуется python 3.4+) как обходной путь, пока они исправляют этот баг.

Я использовал miniconda для создания виртуальной среды в python 3.7.

Как только я создал и активировал виртуальную среду, я:

  1. Создал папки “/var/lib/pgadmin” и “/var/log/pgadmin” и установил правильные права на запись для пользователя, запускающего веб-сервер (apache или пользователя, запускающего “десктопную” версию).

  2. Убедился, что pip установлен в вашей среде:

    conda pip install
    
  3. Скачал последний wheel файл и установил его с помощью pip:

    pip install ./pgadmin4-4.22-py2.py3-none-any.whl
    
  4. Обновил pyasn1 до версии 0.4.8:

    pip install pyasn1==0.4.8
    

    и для обновления до последней версии:

    pip install --upgrade pyasn1
    
  5. Выполнил следующую команду и следовал инструкциям по настройке учетной записи администратора для веб-сервера pgAdmin4:

    pgAdmin4
    

    или

    pgadmin4
    

Для запуска pgAdmin4 каждый раз, вам нужно сначала активировать вашу conda среду, а затем выполнить команду “pgAdmin4” или “pgadmin4”.

Если вам нужен файл конфигурации WSGI, вы можете найти его по адресу [/miniconda/installation/path]/lib/python3.X/site-packages/pgadmin4/ или по адресу [/miniconda/installation/path]/envs/[your_virtualenv_name]/lib/python3.X/site-packages/pgadmin4/.

Чтобы развернуть WSGI сервер для pgAdmin4, пожалуйста, ознакомьтесь с этим документом.

Наконец, если вы хотите использовать другие пути для “/var/lib/pgadmin” и “/var/log/pgadmin”:

  1. Создайте файл config_local.py рядом с существующим файлом config.py. Вы можете найти его в той же директории, где находится файл конфигурации WSGI.

  2. Отредактируйте config_local.py и добавьте следующие установки. В большинстве случаев, местоположение файлов по умолчанию должно быть подходящим:

    LOG_FILE = '/var/log/pgadmin/pgadmin.log'
    SQLITE_PATH = '/var/lib/pgadmin/pgadmin.db'
    SESSION_DB_PATH = '/var/lib/pgadmin/sessions'
    STORAGE_DIR = '/var/lib/pgadmin/storage'
    

Ответ или решение

Проблема с pgAdmin 4, возникшая после обновления Ubuntu 16.04, связана с ошибкой «AttributeError: ‘Request’ object has no attribute ‘is_json’». Это можно объяснить изменениями в библиотеках Python, которые могли произойти в результате обновления системы. В данной статье мы обсудим причины возникновения данной ошибки и предложим пути решения проблемы.

Причины проблемы

После обновления Ubuntu, возможно, произошла несовместимость между версиями библиотек, используемых pgAdmin 4, особенно между Flask и Flask-Security. Ошибка указывает на то, что объект Request не имеет атрибута is_json, который, в свою очередь, ожидается в библиотеке Flask-Security. Это может быть связано с тем, что pgAdmin использует устаревшую версию Flask или Flask-Security, которые не поддерживают все функции используемой версии библиотеки Werkzeug.

Решение проблемы

  1. Создание виртуального окружения:
    Рекомендуется создать виртуальное окружение с использованием Python version 3.8 или выше, так как это может помочь избежать конфликтов с системными библиотеками.

    sudo apt install python3.8 python3.8-venv
    python3.8 -m venv pgadmin_env
    source pgadmin_env/bin/activate
  2. Установка необходимых библиотек:
    Установите необходимые библиотеки, как указано ниже:

    sudo apt install libpq-dev
    pip install -r requirements.txt  # Замените на актуальный файл с зависимостями

    Убедитесь, что используемые библиотеки (например, Flask, Flask-Security, Werkzeug) обновлены до последних совместимых версий.

  3. Обновление pgAdmin до последней версии:
    Используйте pip для установки последней версии pgAdmin 4. На текущий момент последняя версия — 4.22. Сначала загрузите файл-колесо (wheel) с сайта pgAdmin и установите его:

    pip install ./pgadmin4-4.22-py2.py3-none-any.whl
  4. Настройка конфигурационных файлов:
    Создайте локальный конфигурационный файл, если у вас его еще нет, и настройте необходимые параметры:

    # В файле config_local.py
    LOG_FILE = '/var/log/pgadmin/pgadmin.log'
    SQLITE_PATH = '/var/lib/pgadmin/pgadmin.db'
    SESSION_DB_PATH = '/var/lib/pgadmin/sessions'
    STORAGE_DIR = '/var/lib/pgadmin/storage'
  5. Запуск pgAdmin 4:
    После выполнения всех вышеперечисленных шагов, попробуйте запустить pgAdmin 4 с помощью команды:

    python3 /usr/share/pgadmin4/web/pgAdmin4.py

Заключение

Если после выполнения вышеуказанных шагов проблема не устранена, рекомендуется обратиться к сообществу разработчиков PostgreSQL, так как они уже отслеживают эту проблему (как указано в отслеживаемой задаче на redmine.postgresql.org). Поддержание актуальности версий библиотек и внимательное отношение к совместимости поможет избежать подобных проблем в будущем.

Если вам нужна дополнительная информация или помощь, не стесняйтесь обращаться к документации pgAdmin или сообществу разработчиков.

Оцените материал
Добавить комментарий

Капча загружается...