Вопрос или проблема
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.
Вкратце, мои шаги следующие:
- sudo apt install libpq-dev
- активировать виртуальную среду с python 3.8
- pip install -r pip_freeze_output_file.txt
- исправить 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.
Как только я создал и активировал виртуальную среду, я:
-
Создал папки “/var/lib/pgadmin” и “/var/log/pgadmin” и установил правильные права на запись для пользователя, запускающего веб-сервер (apache или пользователя, запускающего “десктопную” версию).
-
Убедился, что pip установлен в вашей среде:
conda pip install
-
Скачал последний wheel файл и установил его с помощью pip:
pip install ./pgadmin4-4.22-py2.py3-none-any.whl
-
Обновил pyasn1 до версии 0.4.8:
pip install pyasn1==0.4.8
и для обновления до последней версии:
pip install --upgrade pyasn1
-
Выполнил следующую команду и следовал инструкциям по настройке учетной записи администратора для веб-сервера 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”:
-
Создайте файл
config_local.py
рядом с существующим файломconfig.py
. Вы можете найти его в той же директории, где находится файл конфигурации WSGI. -
Отредактируйте
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.
Решение проблемы
-
Создание виртуального окружения:
Рекомендуется создать виртуальное окружение с использованием Python version 3.8 или выше, так как это может помочь избежать конфликтов с системными библиотеками.sudo apt install python3.8 python3.8-venv python3.8 -m venv pgadmin_env source pgadmin_env/bin/activate
-
Установка необходимых библиотек:
Установите необходимые библиотеки, как указано ниже:sudo apt install libpq-dev pip install -r requirements.txt # Замените на актуальный файл с зависимостями
Убедитесь, что используемые библиотеки (например,
Flask
,Flask-Security
,Werkzeug
) обновлены до последних совместимых версий. -
Обновление pgAdmin до последней версии:
Используйтеpip
для установки последней версии pgAdmin 4. На текущий момент последняя версия — 4.22. Сначала загрузите файл-колесо (wheel) с сайта pgAdmin и установите его:pip install ./pgadmin4-4.22-py2.py3-none-any.whl
-
Настройка конфигурационных файлов:
Создайте локальный конфигурационный файл, если у вас его еще нет, и настройте необходимые параметры:# В файле 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:
После выполнения всех вышеперечисленных шагов, попробуйте запустить pgAdmin 4 с помощью команды:python3 /usr/share/pgadmin4/web/pgAdmin4.py
Заключение
Если после выполнения вышеуказанных шагов проблема не устранена, рекомендуется обратиться к сообществу разработчиков PostgreSQL, так как они уже отслеживают эту проблему (как указано в отслеживаемой задаче на redmine.postgresql.org). Поддержание актуальности версий библиотек и внимательное отношение к совместимости поможет избежать подобных проблем в будущем.
Если вам нужна дополнительная информация или помощь, не стесняйтесь обращаться к документации pgAdmin или сообществу разработчиков.