在 Heroku 中更新 bson 后 Flask 应用程序损坏
Flask app broken after bson update in Heroku
我有一个在 Heroku 上使用 mongoengine 和 运行 的 Flask 应用程序,初始化时我使用 bson
包,在我将它从 0.5.6
更新到 0.5.7
之后
我开始收到以下错误消息:
[2018-11-23 05:56:43 +0000] [39] [INFO] Worker exiting (pid: 39)
[2018-11-23 05:56:43 +0000] [40] [ERROR] Exception in worker process
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 129, in init_process
self.load_wsgi()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
self.wsgi = self.app.wsgi()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
return self.load_wsgiapp()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
return util.import_app(self.app_uri)
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app
__import__(module)
File "/app/slots_tracker_server/__init__.py", line 5, in <module>
from mongoengine import connect
File "/app/.heroku/python/lib/python3.6/site-packages/mongoengine/__init__.py", line 2, in <module>
from mongoengine import connection
File "/app/.heroku/python/lib/python3.6/site-packages/mongoengine/connection.py", line 1, in <module>
from pymongo import MongoClient, ReadPreference, uri_parser
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/__init__.py", line 77, in <module>
from pymongo.collection import ReturnDocument
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/collection.py", line 20, in <module>
from bson.code import Code
File "/app/.heroku/python/lib/python3.6/site-packages/bson/code.py", line 18, in <module>
from bson.py3compat import abc, string_type, PY3, text_type
ImportError: cannot import name 'abc'
当我重新启动我的服务器时出现此错误,之后我在日志中没有看到错误但我无法访问该应用程序。
我 运行 与 Travis-CI 中的配置相同,但我没有发现任何问题。
知道如何修复它吗?
这是 pip freeze
在我的服务器中的输出:
blinker==1.4
bson==0.5.7
CacheControl==0.12.5
cachetools==3.0.0
certifi==2018.10.15
chardet==3.0.4
Click==7.0
dateutils==0.6.6
firebase-admin==2.13.0
Flask==1.0.2
Flask-Cors==3.0.7
google-api-core==1.5.2
google-auth==1.6.0
google-cloud-core==0.28.1
google-cloud-firestore==0.30.0
google-cloud-storage==1.13.0
google-resumable-media==0.3.1
googleapis-common-protos==1.5.5
grpcio==1.16.1
gspread==3.0.1
gunicorn==19.9.0
httplib2==0.11.3
idna==2.7
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.0
mongoengine==0.16.1
msgpack==0.5.6
numpy==1.15.4
oauth2client==4.1.3
pandas==0.23.4
protobuf==3.6.1
pyasn1==0.4.4
pyasn1-modules==0.2.2
pyfcm==1.4.5
pymongo==3.7.2
python-dateutil==2.7.5
python-http-client==3.1.0
pytz==2018.7
raven==6.9.0
requests==2.20.1
requests-toolbelt==0.8.0
rsa==4.0
sendgrid==5.6.0
six==1.11.0
urllib3==1.24.1
Werkzeug==0.14.1
请注意 pymongo>=2.7.1
作为 mongoengine
的依赖项安装
更新:
删除 bson
并将 pymongo==3.7.2
添加到需求文件后,出现以下错误:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 129, in init_process
self.load_wsgi()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
self.wsgi = self.app.wsgi()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
return self.load_wsgiapp()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
return util.import_app(self.app_uri)
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app
__import__(module)
File "/app/slots_tracker_server/__init__.py", line 5, in <module>
from mongoengine import connect
File "/app/.heroku/python/lib/python3.6/site-packages/mongoengine/__init__.py", line 2, in <module>
from mongoengine import connection
File "/app/.heroku/python/lib/python3.6/site-packages/mongoengine/connection.py", line 1, in <module>
from pymongo import MongoClient, ReadPreference, uri_parser
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/__init__.py", line 77, in <module>
from pymongo.collection import ReturnDocument
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/collection.py", line 20, in <module>
from bson.code import Code
File "/app/.heroku/python/lib/python3.6/site-packages/bson/code.py", line 18, in <module>
from bson.py3compat import abc, string_type, PY3, text_type
ModuleNotFoundError: No module named 'bson.py3compat'
pymongo>=2.7.1 指令覆盖你的 bson 安装
来自 https://github.com/mongodb/mongo-python-driver
Do not install the "bson" package from pypi. PyMongo comes with its
own bson package; doing "easy_install bson" installs a third-party
package that is incompatible with PyMongo.
假设你真的想使用第 3 方 bson,你需要
pip uninstall bson
(删除通过 pymongo 包登陆的覆盖的 bson)
pip install bson
(重新安装 py-bson 包)
或者您可以修补 pymongo 安装以删除 collections.abc 行(显然您并不真的需要它?),但是弄乱生产打包代码是有问题的。
pymongo 模块
https://github.com/mongodb/mongo-python-driver/blob/master/bson/py3compat.py#L22-L25
您正在尝试使用的 py-bson 模块。
https://github.com/py-bson/bson/blob/master/bson/py3compat.py#L22-L24
我 运行 上周解决了这个问题。在我的电脑上,代码 运行 没问题。但是在 Heroku 上,它失败并出现同样的错误。
也许有点晚了,但如果更多人运行遇到这样的问题,我会指出是什么解决了我的问题。
首先我尝试:
- 更改 BSON 和 PyMongo 模块的版本。
- 删除
.venv
目录。
- 执行我在网上看到的其他不同建议。
在 none 为我工作后,我使用以下命令跟踪了有问题的导入(通过 Heroku CLI):
heroku logs --tails
我发现了导入了哪些模块、从哪里导入了哪些模块,并且我在主应用程序文件中导入了相同的模块。
我会更详细地解释。
问题始于导入 json_util
:
from bson import json_util
如果我们打开 json_util
文件,我们将看到其他导入以及其中进行的下一个有问题的导入:
from bson.py3compat import (PY3, iteritems, integer_types, string_type, text_type)
在 bson.py3compat
模块中,您可以找到下一个导入:
from abc import ABC, abstractmethod
import collections.abc as abc
我把所有这 3 个导入都直接导入到主应用程序中:
from flask import Flask
from flask_pymongo import PyMongo
from bson import json_util
from bson.py3compat import PY3 #1
import collections.abc as ABC #2
from abc import ABC, abstractmethod #3
# Init
app = Flask(__name__)
这些步骤已经解决了我的问题,希望对您也有帮助。
它可能不是最智能的解决方案,但在紧急情况下,它是极好的。
我有一个在 Heroku 上使用 mongoengine 和 运行 的 Flask 应用程序,初始化时我使用 bson
包,在我将它从 0.5.6
更新到 0.5.7
之后
我开始收到以下错误消息:
[2018-11-23 05:56:43 +0000] [39] [INFO] Worker exiting (pid: 39)
[2018-11-23 05:56:43 +0000] [40] [ERROR] Exception in worker process
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 129, in init_process
self.load_wsgi()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
self.wsgi = self.app.wsgi()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
return self.load_wsgiapp()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
return util.import_app(self.app_uri)
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app
__import__(module)
File "/app/slots_tracker_server/__init__.py", line 5, in <module>
from mongoengine import connect
File "/app/.heroku/python/lib/python3.6/site-packages/mongoengine/__init__.py", line 2, in <module>
from mongoengine import connection
File "/app/.heroku/python/lib/python3.6/site-packages/mongoengine/connection.py", line 1, in <module>
from pymongo import MongoClient, ReadPreference, uri_parser
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/__init__.py", line 77, in <module>
from pymongo.collection import ReturnDocument
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/collection.py", line 20, in <module>
from bson.code import Code
File "/app/.heroku/python/lib/python3.6/site-packages/bson/code.py", line 18, in <module>
from bson.py3compat import abc, string_type, PY3, text_type
ImportError: cannot import name 'abc'
当我重新启动我的服务器时出现此错误,之后我在日志中没有看到错误但我无法访问该应用程序。 我 运行 与 Travis-CI 中的配置相同,但我没有发现任何问题。 知道如何修复它吗?
这是 pip freeze
在我的服务器中的输出:
blinker==1.4
bson==0.5.7
CacheControl==0.12.5
cachetools==3.0.0
certifi==2018.10.15
chardet==3.0.4
Click==7.0
dateutils==0.6.6
firebase-admin==2.13.0
Flask==1.0.2
Flask-Cors==3.0.7
google-api-core==1.5.2
google-auth==1.6.0
google-cloud-core==0.28.1
google-cloud-firestore==0.30.0
google-cloud-storage==1.13.0
google-resumable-media==0.3.1
googleapis-common-protos==1.5.5
grpcio==1.16.1
gspread==3.0.1
gunicorn==19.9.0
httplib2==0.11.3
idna==2.7
itsdangerous==1.1.0
Jinja2==2.10
MarkupSafe==1.1.0
mongoengine==0.16.1
msgpack==0.5.6
numpy==1.15.4
oauth2client==4.1.3
pandas==0.23.4
protobuf==3.6.1
pyasn1==0.4.4
pyasn1-modules==0.2.2
pyfcm==1.4.5
pymongo==3.7.2
python-dateutil==2.7.5
python-http-client==3.1.0
pytz==2018.7
raven==6.9.0
requests==2.20.1
requests-toolbelt==0.8.0
rsa==4.0
sendgrid==5.6.0
six==1.11.0
urllib3==1.24.1
Werkzeug==0.14.1
请注意 pymongo>=2.7.1
作为 mongoengine
更新:
删除 bson
并将 pymongo==3.7.2
添加到需求文件后,出现以下错误:
Traceback (most recent call last):
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 129, in init_process
self.load_wsgi()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/workers/base.py", line 138, in load_wsgi
self.wsgi = self.app.wsgi()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 52, in load
return self.load_wsgiapp()
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 41, in load_wsgiapp
return util.import_app(self.app_uri)
File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/util.py", line 350, in import_app
__import__(module)
File "/app/slots_tracker_server/__init__.py", line 5, in <module>
from mongoengine import connect
File "/app/.heroku/python/lib/python3.6/site-packages/mongoengine/__init__.py", line 2, in <module>
from mongoengine import connection
File "/app/.heroku/python/lib/python3.6/site-packages/mongoengine/connection.py", line 1, in <module>
from pymongo import MongoClient, ReadPreference, uri_parser
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/__init__.py", line 77, in <module>
from pymongo.collection import ReturnDocument
File "/app/.heroku/python/lib/python3.6/site-packages/pymongo/collection.py", line 20, in <module>
from bson.code import Code
File "/app/.heroku/python/lib/python3.6/site-packages/bson/code.py", line 18, in <module>
from bson.py3compat import abc, string_type, PY3, text_type
ModuleNotFoundError: No module named 'bson.py3compat'
pymongo>=2.7.1 指令覆盖你的 bson 安装
来自 https://github.com/mongodb/mongo-python-driver
Do not install the "bson" package from pypi. PyMongo comes with its own bson package; doing "easy_install bson" installs a third-party package that is incompatible with PyMongo.
假设你真的想使用第 3 方 bson,你需要
pip uninstall bson
(删除通过 pymongo 包登陆的覆盖的 bson)pip install bson
(重新安装 py-bson 包)
或者您可以修补 pymongo 安装以删除 collections.abc 行(显然您并不真的需要它?),但是弄乱生产打包代码是有问题的。
pymongo 模块 https://github.com/mongodb/mongo-python-driver/blob/master/bson/py3compat.py#L22-L25
您正在尝试使用的 py-bson 模块。 https://github.com/py-bson/bson/blob/master/bson/py3compat.py#L22-L24
我 运行 上周解决了这个问题。在我的电脑上,代码 运行 没问题。但是在 Heroku 上,它失败并出现同样的错误。
也许有点晚了,但如果更多人运行遇到这样的问题,我会指出是什么解决了我的问题。
首先我尝试:
- 更改 BSON 和 PyMongo 模块的版本。
- 删除
.venv
目录。 - 执行我在网上看到的其他不同建议。
在 none 为我工作后,我使用以下命令跟踪了有问题的导入(通过 Heroku CLI):
heroku logs --tails
我发现了导入了哪些模块、从哪里导入了哪些模块,并且我在主应用程序文件中导入了相同的模块。
我会更详细地解释。
问题始于导入 json_util
:
from bson import json_util
如果我们打开 json_util
文件,我们将看到其他导入以及其中进行的下一个有问题的导入:
from bson.py3compat import (PY3, iteritems, integer_types, string_type, text_type)
在 bson.py3compat
模块中,您可以找到下一个导入:
from abc import ABC, abstractmethod
import collections.abc as abc
我把所有这 3 个导入都直接导入到主应用程序中:
from flask import Flask
from flask_pymongo import PyMongo
from bson import json_util
from bson.py3compat import PY3 #1
import collections.abc as ABC #2
from abc import ABC, abstractmethod #3
# Init
app = Flask(__name__)
这些步骤已经解决了我的问题,希望对您也有帮助。 它可能不是最智能的解决方案,但在紧急情况下,它是极好的。