Python Flask admin无法在uWSGI和Nginx下导入名称\u类\u解析器
我使用uWSGI和Nginx在AWS中主持了一个python Flask项目,最初一切正常,但后来我决定实现Flask admin模块。现在页面向我显示一条内部服务器错误消息 我查看了UWSGI日志,并说:Python Flask admin无法在uWSGI和Nginx下导入名称\u类\u解析器,python,nginx,flask,uwsgi,flask-admin,Python,Nginx,Flask,Uwsgi,Flask Admin,我使用uWSGI和Nginx在AWS中主持了一个python Flask项目,最初一切正常,但后来我决定实现Flask admin模块。现在页面向我显示一条内部服务器错误消息 我查看了UWSGI日志,并说: Traceback (most recent call last): File "/var/www/project/run.py", line 2, in <module> from app import app File "/var/www/project/
Traceback (most recent call last):
File "/var/www/project/run.py", line 2, in <module>
from app import app
File "/var/www/project/app/__init__.py", line 22, in <module>
from app import views
File "/var/www/project/app/views.py", line 15, in <module>
from flask_admin.contrib.sqla import ModelView
File "/var/www/project/venv/local/lib/python2.7/site-packages/flask_admin/contrib/sqla/__init__.py", line 2, in <module>
from .view import ModelView
File "/var/www/project/venv/local/lib/python2.7/site-packages/flask_admin/contrib/sqla/view.py", line 17, in <module>
from flask_admin.contrib.sqla.tools import is_relationship
File "/var/www/project/venv/local/lib/python2.7/site-packages/flask_admin/contrib/sqla/tools.py", line 4, in <module>
from sqlalchemy.ext.declarative.clsregistry import _class_resolver
ImportError: cannot import name _class_resolver
Fri Nov 10 07:41:08 2017 - unable to load app 0 (mountpoint='project.domain.com|') (callable not found or import error)
Fri Nov 10 07:41:08 2017 - --- no python application found, check your startup logs for errors ---
编辑:
如果我评论这一行,一切都会正常工作:
from flask_admin.contrib.sqla import ModelView
谷歌搜索我注意到,ImportError可能是由于冗余导入造成的,但我认为所有flask管理导入都是必要的
我认为问题不是由uWSGI引起的,但这里是配置文件:
[uwsgi]
uid = www-data
gid = www-data
plugins=python
vhost=true
socket=/tmp/project.sock
chmod-socket = 666
chown-socket = www-data:www-data
enable-threads = true
procname-prefix = project_
chdir = /var/www/project
server {
listen 80 ssl;
server_name project.domain.com;
listen 443 ssl;
ssl_certificate /etc/nginx/project.domain.com/fullchain.pem;
ssl_certificate_key /etc/nginx/project.domain.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !MEDIUM !RC4";
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
location /static/ {
autoindex on;
alias /var/www/project/app/static/;
}
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/project.sock;
uwsgi_read_timeout 300;
uwsgi_param UWSGI_PYHOME /var/www/project/venv;
uwsgi_param UWSGI_CHDIR /var/www/project;
uwsgi_param UWSGI_MODULE run;
uwsgi_param UWSGI_CALLABLE app;
}
error_page 404 /404.html;
location /socket.io {
include proxy_params;
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://127.0.0.1:5010/socket.io;
}
}
我再次创建了虚拟环境,但是所有的东西都安装得很好
EDIT:应该注意的是,当我直接执行run.py文件时,一切都按预期工作,即使使用flask admin导入,问题也在uWSGI之下
最后,我的项目托管在Ubuntu14.04可靠的AWS依赖项中
编辑:
正在添加run.py文件:
#!venv/bin/python
from app import app
if __name__ == '__main__':
app.run(host='0.0.0.0', threaded=True, debug=True, port=5010)
编辑2:
正在添加\uuuuu init\uuuuuuuuuu.py文件:
# -*- coding: utf-8 -*-
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_socketio import SocketIO
#import flask_admin as admin
from flask_babel import Babel
#I've defined the next three lines to avoid encoding conflicts
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
app = Flask(__name__)
app.config.from_pyfile('../config.py')
appname = 'Project'
db = SQLAlchemy(app, session_options={'autoflush': False})
babel = Babel(app)
async_mode = None
socketio = SocketIO(app, async_mode=async_mode, ping_timeout=1800)
from app import views
venv/bin/pip冻结
输出:
Babel==2.5.1
Flask==0.12.2
Flask-Admin==1.5.0
Flask-Babel==0.11.2
Flask-SQLAlchemy==2.3.2
Flask-SocketIO==2.9.2
Jinja2==2.9.6
MarkupSafe==1.0
SQLAlchemy==1.1.14
WTForms==2.1
Werkzeug==0.12.2
argparse==1.2.1
asn1crypto==0.22.0
certifi==2017.7.27.1
chardet==3.0.4
click==6.7
click-completion==0.2.1
colorama==0.3.9
crayons==0.1.2
elibom==1.2
gunicorn==19.7.1
idna==2.6
itsdangerous==0.24
psycopg2==2.7.3.1
py==1.4.34
pycycle==0.0.8
pytest==3.2.3
python-engineio==1.7.0
python-socketio==1.8.1
pytz==2017.3
requests==2.18.4
six==1.11.0
uWSGI==2.0.15
urllib3==1.22
wsgiref==0.1.2
Nginx配置文件:
[uwsgi]
uid = www-data
gid = www-data
plugins=python
vhost=true
socket=/tmp/project.sock
chmod-socket = 666
chown-socket = www-data:www-data
enable-threads = true
procname-prefix = project_
chdir = /var/www/project
server {
listen 80 ssl;
server_name project.domain.com;
listen 443 ssl;
ssl_certificate /etc/nginx/project.domain.com/fullchain.pem;
ssl_certificate_key /etc/nginx/project.domain.com/privkey.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !MEDIUM !RC4";
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
location /static/ {
autoindex on;
alias /var/www/project/app/static/;
}
location / {
include uwsgi_params;
uwsgi_pass unix:/tmp/project.sock;
uwsgi_read_timeout 300;
uwsgi_param UWSGI_PYHOME /var/www/project/venv;
uwsgi_param UWSGI_CHDIR /var/www/project;
uwsgi_param UWSGI_MODULE run;
uwsgi_param UWSGI_CALLABLE app;
}
error_page 404 /404.html;
location /socket.io {
include proxy_params;
proxy_http_version 1.1;
proxy_buffering off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_pass http://127.0.0.1:5010/socket.io;
}
}
非常感谢您的帮助。我将从即时错误开始,然后说明它可能与uWSGI运行方式不同的原因 即时错误: 这里有一点快速和松散的导入,这在您构建某些东西或附加特性时很常见。一个好的开始是将其削回以减少冗余并清理。即使您不在途中解决问题,每次删除都会使剩余的导入更容易考虑 除了注释中建议的更改Luis外,您还可以组合使用不同约定从同一位置导入的以下两行: 以管理员身份导入您的管理员 从flask_管理员导入管理员、助手、公开 您可以只导入flask_admin本身:
import flask_admin
...
class MyAdminIndexView(flask_admin.AdminIndexView):
@flask_admin.expose('/')
...
admin = flask_admin.Admin...
或者您可以将AdminIndexView
添加到显式导入列表中:
from flask_admin import Admin, AdminIndexView, helpers, expose
我遇到的大多数Flask导入错误都来自于尝试从应用程序中导入另一个尚未正确初始化的对象(通常是由于循环导入),因此我猜它隐藏在以下三行之一的后面:
from app import app
...
from models import RequestsLog
...
from app import db, appname
原因可能会在你身上跳出来,但有时这个循环有好几个模块。如果没有,下一个好的步骤是通过一个过梁运行您的项目,例如。如果您已经在运行Pylint,则可能需要仔细检查您的设置,并确保启用了与导入相关的规则!如果您还没有使用它,您可以从命令行手动运行它,或者通过一个编辑器插件使用它,该插件可以在您工作时运行您的代码(如果您还没有使用linting,可能会抱怨很多问题,但我将从导入/模块相关的代码开始)
你也可以用一个更专注的工具更快地找到它,比如,尽管我自己还没有尝试过
有时,通过仔细的设计或稍加重构,您可以避免Flask中的循环导入问题,但随着应用程序复杂性的增加,新功能更有可能引导您进入循环导入。如果您发现了问题,但找不到明显的解决方法,下一步通常是采用烧瓶。这种模式并不神奇——您仍然可以将自己绘制到导入问题的各个角落——但它确实会使您更容易重构自己
从uWSGI运行:
现在,我认为这是在命令行和uWSGI后面通过python运行时看到不同行为的两个最可能的原因。这只是一个通用列表,因为更具体的答案取决于您所包含的文件之外的一些内容。uWSGI和nginx都有一系列相当复杂的配置选项,我是从内存中飞出来的,所以我可能不完全准确…:)
的东西(如果uuu name\uuuu=='\uuu main\uuuu':
),因此在这两种情况下运行的代码并不完全相同
run.py
中查找可调用(通常是app
或application
)时,会发生导入异常。您是否从CLI运行相同的代码
我将从即时错误开始,然后说明它可能与uWSGI运行方式不同的原因 即时错误: 这里有一点快速和松散的导入,这在您构建某些东西或附加特性时很常见。一个好的开始是将其削回以减少冗余并清理。即使您不在途中解决问题,每次删除都会使剩余的导入更容易考虑 除了注释中建议的更改Luis外,您还可以组合使用不同约定从同一位置导入的以下两行: 以管理员身份导入您的管理员 从flask_管理员导入管理员、助手、公开 您可以只导入flask_admin本身:
import flask_admin
...
class MyAdminIndexView(flask_admin.AdminIndexView):
@flask_admin.expose('/')
...
admin = flask_admin.Admin...
或者您可以将AdminIndexView
添加到显式导入列表中:
from flask_admin import Admin, AdminIndexView, helpers, expose
我遇到的大多数Flask导入错误都来自于尝试从应用程序中导入另一个尚未正确初始化的对象(通常是由于循环导入),因此我猜它隐藏在以下三行之一的后面:
from app import app
...
from models import RequestsLog
...
from app import db, appname
原因可能会突然改变